• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // test the basename, dirname, basename_r and dirname_r
2 #include <libgen.h>
3 #include <errno.h>
4 #include <stdio.h>
5 #include <string.h>
6 
7 static int  fail = 0;
8 
9 static void
test_basename(char * _input,const char * _expected,int _errno)10 test_basename(char*  _input, const char*  _expected, int  _errno)
11 {
12     char   temp[256], *input = _input;
13     char*  ret;
14 #if HOST
15     /* GLibc does modify the input string. bummer */
16     if (_input) {
17         strcpy(temp, _input);
18         input = temp;
19     }
20 #endif
21     errno = 0;
22     ret   = basename(input);
23     if (_expected == NULL) {
24         if (ret != NULL) {
25             fprintf(stderr,
26                     "KO: basename(\"%s\") returned \"%s\", NULL expected)\n",
27                     _input, ret);
28             fail += 1;
29         } else if (errno != _errno) {
30             fprintf(stderr,
31                     "KO: basename(\"%s\") returned NULL with error: %d (%d expected)\n",
32                     _input, errno, _errno);
33             fail += 1;
34         } else {
35             printf( "OK: basename(\"%s\") returned NULL with error %d\n",
36                     _input, _errno );
37         }
38     } else {
39         if (ret == NULL) {
40             fprintf(stderr, "KO: basename(\"%s\") returned NULL with error %d\n",
41                     _input, errno);
42             fail += 1;
43         }
44         else if (strcmp(ret, _expected)) {
45             fprintf(stderr, "KO: basename(\"%s\") returned \"%s\", instead of \"%s\"\n",
46                     _input, ret, _expected);
47         }
48         else {
49             printf( "OK: basename(\"%s\") returned \"%s\"\n",
50                     _input, ret );
51         }
52     }
53 }
54 
55 
56 #if !HOST
57 static void
test_basename_r(char * _input,const char * _expected_content,int _expected,char * _buff,size_t _bufflen,int _errno)58 test_basename_r(char*  _input, const char*  _expected_content, int  _expected, char*  _buff, size_t  _bufflen, int  _errno)
59 {
60     int   ret;
61     errno = 0;
62     ret   = basename_r(_input, _buff, _bufflen );
63     if (ret != _expected) {
64         fprintf(stderr,
65                 "KO: basename_r(\"%s\", <buff>, %d) returned %d (expected %d)\n",
66                 _input, _bufflen, ret, _expected);
67         fail += 1;
68         return;
69     }
70     if (ret == -1) {
71         if (errno != _errno) {
72             fprintf(stderr,
73                     "KO: basename_r(\"%s\", <buff>, %d) returned -1 with errno=%d (expected %d)\n",
74                     _input, _bufflen, errno, _errno);
75             fail += 1;
76             return;
77         }
78     }
79     else if (_buff != NULL && memcmp( _buff, _expected_content, ret ) ) {
80         fprintf(stderr,
81                 "KO: basename_r(\"%s\", <buff>, %d) returned \"%s\", expected \"%s\"\n",
82                 _input, _bufflen, _buff, _expected_content );
83         fail += 1;
84         return;
85     }
86     printf("OK: basename_r(\"%s\", <buff>, %d) returned \"%s\"\n",
87             _input, _bufflen, _expected_content );
88 }
89 
90 static void
test_dirname_r(char * _input,const char * _expected_content,int _expected,char * _buff,size_t _bufflen,int _errno)91 test_dirname_r(char*  _input, const char*  _expected_content, int  _expected, char*  _buff, size_t  _bufflen, int  _errno)
92 {
93     int   ret;
94     errno = 0;
95     ret   = dirname_r(_input, _buff, _bufflen );
96     if (ret != _expected) {
97         fprintf(stderr,
98                 "KO: dirname_r(\"%s\", <buff>, %d) returned %d (expected %d)\n",
99                 _input, _bufflen, ret, _expected);
100         fail += 1;
101         return;
102     }
103     if (ret == -1) {
104         if (errno != _errno) {
105             fprintf(stderr,
106                     "KO: dirname_r(\"%s\", <buff>, %d) returned -1 with errno=%d (expected %d)\n",
107                     _input, _bufflen, errno, _errno);
108             fail += 1;
109             return;
110         }
111     }
112     else if (_buff != NULL &&  memcmp( _buff, _expected_content, ret ) ) {
113         fprintf(stderr,
114                 "KO: dirname_r(\"%s\", <buff>, %d) returned \"%s\", expected \"%s\"\n",
115                 _input, _bufflen, _buff, _expected_content );
116         fail += 1;
117         return;
118     }
119     printf("OK: dirname_r(\"%s\", <buff>, %d) returned \"%s\"\n",
120             _input, _bufflen, _expected_content );
121 }
122 #endif
123 
124 
125 static void
test_dirname(char * _input,const char * _expected,int _errno)126 test_dirname(char*  _input, const char*  _expected, int  _errno)
127 {
128     char   temp[256], *input = _input;
129     char*  ret;
130 #if HOST
131     /* GLibc does modify the input string. bummer */
132     if (_input) {
133         strcpy(temp, _input);
134         input = temp;
135     }
136 #endif
137     errno = 0;
138     ret   = dirname(input);
139     if (_expected == NULL) {
140         if (ret != NULL) {
141             fprintf(stderr,
142                     "KO: dirname(\"%s\") returned \"%s\", NULL expected)\n",
143                     _input, ret);
144             fail += 1;
145         } else if (errno != _errno) {
146             fprintf(stderr,
147                     "KO: dirname(\"%s\") returned NULL with error: %d (%d expected)\n",
148                     _input, errno, _errno);
149             fail += 1;
150         } else {
151             printf( "OK: dirname(\"%s\") returned NULL with error %d\n",
152                     _input, _errno );
153         }
154     } else {
155         if (ret == NULL) {
156             fprintf(stderr, "KO: dirname(\"%s\") returned NULL with error %d\n",
157                     _input, errno);
158             fail += 1;
159         }
160         else if (strcmp(ret, _expected)) {
161             fprintf(stderr, "KO: dirname(\"%s\") returned \"%s\", instead of \"%s\"\n",
162                     _input, ret, _expected);
163         }
164         else {
165             printf( "OK: dirname(\"%s\") returned \"%s\"\n",
166                     _input, ret );
167         }
168     }
169 }
170 
171 
172 
173 
main(void)174 int  main( void )
175 {
176     char  buff[256];
177 
178     test_basename( "", ".", 0 );
179     test_basename( "/usr/lib", "lib", 0 );
180     test_basename( "/usr/", "usr", 0 );
181     test_basename( "usr", "usr", 0 );
182     test_basename( "/", "/", 0 );
183     test_basename( ".", ".", 0 );
184     test_basename( "..", "..", 0 );
185 
186 #if !HOST
187     test_basename_r( "", ".",  1, NULL, 0, 0 );
188     test_basename_r( "", ".", -1, buff, 0, ERANGE );
189     test_basename_r( "", ".", -1, buff, 1, ERANGE );
190     test_basename_r( "", ".", 1, buff, 2, 0 );
191     test_basename_r( "", ".", 1, buff, sizeof(buff), 0 );
192     test_basename_r( "/usr/lib", "lib", 3, buff, sizeof(buff), 0 );
193     test_basename_r( "/usr/", "usr", 3, buff, sizeof(buff), 0 );
194     test_basename_r( "usr", "usr", 3, buff, sizeof(buff), 0 );
195     test_basename_r( "/", "/", 1, buff, sizeof(buff), 0 );
196     test_basename_r( ".", ".", 1, buff, sizeof(buff), 0 );
197     test_basename_r( "..", "..", 2, buff, sizeof(buff), 0 );
198 #endif
199 
200     test_dirname( "", ".", 0 );
201     test_dirname( "/usr/lib", "/usr", 0 );
202     test_dirname( "/usr/", "/", 0 );
203     test_dirname( "usr", ".", 0 );
204     test_dirname( ".", ".", 0 );
205     test_dirname( "..", ".", 0 );
206 
207 #if !HOST
208     test_dirname_r( "", ".",  1, NULL, 0, 0 );
209     test_dirname_r( "", ".", -1, buff, 0, ERANGE );
210     test_dirname_r( "", ".", -1, buff, 1, ERANGE );
211     test_dirname_r( "", ".", 1, buff, 2, 0 );
212     test_dirname_r( "/usr/lib", "/usr", 4, buff, sizeof(buff), 0 );
213     test_dirname_r( "/usr/", "/", 1, buff, sizeof(buff), 0 );
214     test_dirname_r( "usr", ".", 1, buff, sizeof(buff), 0 );
215     test_dirname_r( ".", ".", 1, buff, sizeof(buff), 0 );
216     test_dirname_r( "..", ".", 1, buff, sizeof(buff), 0 );
217 #endif
218 
219     return (fail > 0);
220 }
221 
222