1 /* BZ 11039 */
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 static int
one_test(const char * fmt,int argc,char * argv[],int expected[argc-1])7 one_test (const char *fmt, int argc, char *argv[], int expected[argc - 1])
8 {
9 optind = 1;
10
11 int res = 0;
12 for (int i = 0; i < argc - 1; ++i)
13 {
14 rewind (stderr);
15 if (ftruncate (fileno (stderr), 0) != 0)
16 {
17 puts ("cannot truncate file");
18 return 1;
19 }
20
21 int c = getopt (argc, argv, fmt);
22 if (c != expected[i])
23 {
24 printf ("format '%s' test %d failed: expected '%c', got '%c'\n",
25 fmt, i, expected[i], c);
26 res = 1;
27 }
28 if (ftell (stderr) != 0)
29 {
30 printf ("format '%s' test %d failed: printed to stderr\n",
31 fmt, i);
32 res = 1;
33 }
34 }
35
36 return res;
37 }
38
39
40 static int
do_test(void)41 do_test (void)
42 {
43 char fname[] = "/tmp/bug-getopt1.XXXXXX";
44 int fd = mkstemp (fname);
45 if (fd == -1)
46 {
47 printf ("mkstemp failed: %m\n");
48 return 1;
49 }
50 close (fd);
51
52 if (freopen (fname, "w+", stderr) == NULL)
53 {
54 puts ("cannot redirect stderr");
55 return 1;
56 }
57
58 remove (fname);
59
60 int ret = one_test ("+:a:b", 2,
61 (char *[2]) { (char *) "bug-getopt1", (char *) "-a" },
62 (int [1]) { ':' });
63
64 ret |= one_test ("+:a:b", 3,
65 (char *[3]) { (char *) "bug-getopt1", (char *) "-b",
66 (char *) "-a" },
67 (int [2]) { 'b', ':' });
68
69 if (ret == 0)
70 puts ("all OK");
71
72 return ret;
73 }
74
75 #define TEST_FUNCTION do_test ()
76 #include "../test-skeleton.c"
77