1 /* Copyright (C) 1997-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <getopt.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <unistd.h>
22 #include <glob.h>
23 
24 int
main(int argc,char * argv[])25 main (int argc, char *argv[])
26 {
27   int i, j;
28   int glob_flags = 0;
29   glob_t g;
30   int quotes = 1;
31 
32   g.gl_offs = 0;
33 
34   while ((i = getopt (argc, argv, "bcdeEgmopqstT")) != -1)
35     switch(i)
36       {
37       case 'b':
38 	glob_flags |= GLOB_BRACE;
39 	break;
40       case 'c':
41 	glob_flags |= GLOB_NOCHECK;
42 	break;
43       case 'd':
44 	glob_flags |= GLOB_ONLYDIR;
45 	break;
46       case 'e':
47 	glob_flags |= GLOB_NOESCAPE;
48 	break;
49       case 'E':
50 	glob_flags |= GLOB_ERR;
51 	break;
52       case 'g':
53 	glob_flags |= GLOB_NOMAGIC;
54 	break;
55       case 'm':
56 	glob_flags |= GLOB_MARK;
57 	break;
58       case 'o':
59 	glob_flags |= GLOB_DOOFFS;
60 	g.gl_offs = 1;
61 	break;
62       case 'p':
63 	glob_flags |= GLOB_PERIOD;
64 	break;
65       case 'q':
66 	quotes = 0;
67 	break;
68       case 's':
69 	glob_flags |= GLOB_NOSORT;
70 	break;
71       case 't':
72 	glob_flags |= GLOB_TILDE;
73 	break;
74       case 'T':
75 	glob_flags |= GLOB_TILDE_CHECK;
76 	break;
77       default:
78 	exit (-1);
79       }
80 
81   if (optind >= argc || chdir (argv[optind]))
82     exit(1);
83 
84   j = optind + 1;
85   if (optind + 1 >= argc)
86     exit (1);
87 
88   /* Do a glob on each remaining argument.  */
89   for (j = optind + 1; j < argc; j++) {
90     i = glob (argv[j], glob_flags, NULL, &g);
91     if (i != 0)
92       break;
93     glob_flags |= GLOB_APPEND;
94   }
95 
96   /* Was there an error? */
97   if (i == GLOB_NOSPACE)
98     puts ("GLOB_NOSPACE");
99   else if (i == GLOB_ABORTED)
100     puts ("GLOB_ABORTED");
101   else if (i == GLOB_NOMATCH)
102     puts ("GLOB_NOMATCH");
103 
104   /* If we set an offset, fill in the first field.
105      (Unless glob() has filled it in already - which is an error) */
106   if ((glob_flags & GLOB_DOOFFS) && g.gl_pathv[0] == NULL)
107     g.gl_pathv[0] = (char *) "abc";
108 
109   /* Print out the names.  Unless otherwise specified, qoute them.  */
110   if (g.gl_pathv)
111     {
112       for (i = 0; i < g.gl_offs + g.gl_pathc; ++i)
113         printf ("%s%s%s\n", quotes ? "`" : "",
114 		g.gl_pathv[i] ? g.gl_pathv[i] : "(null)",
115 		quotes ? "'" : "");
116     }
117   return 0;
118 }
119