1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Directory routines for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * This set of APIs abstracts enumeration of directory entries.
5*5e7646d2SAndroid Build Coastguard Worker *
6*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2017 by Apple Inc.
7*5e7646d2SAndroid Build Coastguard Worker * Copyright 1997-2005 by Easy Software Products, all rights reserved.
8*5e7646d2SAndroid Build Coastguard Worker *
9*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
10*5e7646d2SAndroid Build Coastguard Worker */
11*5e7646d2SAndroid Build Coastguard Worker
12*5e7646d2SAndroid Build Coastguard Worker /*
13*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
14*5e7646d2SAndroid Build Coastguard Worker */
15*5e7646d2SAndroid Build Coastguard Worker
16*5e7646d2SAndroid Build Coastguard Worker #include "string-private.h"
17*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
18*5e7646d2SAndroid Build Coastguard Worker #include "dir.h"
19*5e7646d2SAndroid Build Coastguard Worker
20*5e7646d2SAndroid Build Coastguard Worker
21*5e7646d2SAndroid Build Coastguard Worker /*
22*5e7646d2SAndroid Build Coastguard Worker * Windows implementation...
23*5e7646d2SAndroid Build Coastguard Worker */
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
26*5e7646d2SAndroid Build Coastguard Worker # include <windows.h>
27*5e7646d2SAndroid Build Coastguard Worker
28*5e7646d2SAndroid Build Coastguard Worker /*
29*5e7646d2SAndroid Build Coastguard Worker * Types and structures...
30*5e7646d2SAndroid Build Coastguard Worker */
31*5e7646d2SAndroid Build Coastguard Worker
32*5e7646d2SAndroid Build Coastguard Worker struct _cups_dir_s /**** Directory data structure ****/
33*5e7646d2SAndroid Build Coastguard Worker {
34*5e7646d2SAndroid Build Coastguard Worker char directory[1024]; /* Directory filename */
35*5e7646d2SAndroid Build Coastguard Worker HANDLE dir; /* Directory handle */
36*5e7646d2SAndroid Build Coastguard Worker cups_dentry_t entry; /* Directory entry */
37*5e7646d2SAndroid Build Coastguard Worker };
38*5e7646d2SAndroid Build Coastguard Worker
39*5e7646d2SAndroid Build Coastguard Worker
40*5e7646d2SAndroid Build Coastguard Worker /*
41*5e7646d2SAndroid Build Coastguard Worker * '_cups_dir_time()' - Convert a FILETIME value to a UNIX time value.
42*5e7646d2SAndroid Build Coastguard Worker */
43*5e7646d2SAndroid Build Coastguard Worker
44*5e7646d2SAndroid Build Coastguard Worker time_t /* O - UNIX time */
_cups_dir_time(FILETIME ft)45*5e7646d2SAndroid Build Coastguard Worker _cups_dir_time(FILETIME ft) /* I - File time */
46*5e7646d2SAndroid Build Coastguard Worker {
47*5e7646d2SAndroid Build Coastguard Worker ULONGLONG val; /* File time in 0.1 usecs */
48*5e7646d2SAndroid Build Coastguard Worker
49*5e7646d2SAndroid Build Coastguard Worker
50*5e7646d2SAndroid Build Coastguard Worker /*
51*5e7646d2SAndroid Build Coastguard Worker * Convert file time (1/10 microseconds since Jan 1, 1601) to UNIX
52*5e7646d2SAndroid Build Coastguard Worker * time (seconds since Jan 1, 1970). There are 11,644,732,800 seconds
53*5e7646d2SAndroid Build Coastguard Worker * between them...
54*5e7646d2SAndroid Build Coastguard Worker */
55*5e7646d2SAndroid Build Coastguard Worker
56*5e7646d2SAndroid Build Coastguard Worker val = ft.dwLowDateTime + ((ULONGLONG)ft.dwHighDateTime << 32);
57*5e7646d2SAndroid Build Coastguard Worker return ((time_t)(val / 10000000 - 11644732800));
58*5e7646d2SAndroid Build Coastguard Worker }
59*5e7646d2SAndroid Build Coastguard Worker
60*5e7646d2SAndroid Build Coastguard Worker
61*5e7646d2SAndroid Build Coastguard Worker /*
62*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirClose()' - Close a directory.
63*5e7646d2SAndroid Build Coastguard Worker *
64*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
65*5e7646d2SAndroid Build Coastguard Worker */
66*5e7646d2SAndroid Build Coastguard Worker
67*5e7646d2SAndroid Build Coastguard Worker void
cupsDirClose(cups_dir_t * dp)68*5e7646d2SAndroid Build Coastguard Worker cupsDirClose(cups_dir_t *dp) /* I - Directory pointer */
69*5e7646d2SAndroid Build Coastguard Worker {
70*5e7646d2SAndroid Build Coastguard Worker /*
71*5e7646d2SAndroid Build Coastguard Worker * Range check input...
72*5e7646d2SAndroid Build Coastguard Worker */
73*5e7646d2SAndroid Build Coastguard Worker
74*5e7646d2SAndroid Build Coastguard Worker if (!dp)
75*5e7646d2SAndroid Build Coastguard Worker return;
76*5e7646d2SAndroid Build Coastguard Worker
77*5e7646d2SAndroid Build Coastguard Worker /*
78*5e7646d2SAndroid Build Coastguard Worker * Close an open directory handle...
79*5e7646d2SAndroid Build Coastguard Worker */
80*5e7646d2SAndroid Build Coastguard Worker
81*5e7646d2SAndroid Build Coastguard Worker if (dp->dir != INVALID_HANDLE_VALUE)
82*5e7646d2SAndroid Build Coastguard Worker FindClose(dp->dir);
83*5e7646d2SAndroid Build Coastguard Worker
84*5e7646d2SAndroid Build Coastguard Worker /*
85*5e7646d2SAndroid Build Coastguard Worker * Free memory used...
86*5e7646d2SAndroid Build Coastguard Worker */
87*5e7646d2SAndroid Build Coastguard Worker
88*5e7646d2SAndroid Build Coastguard Worker free(dp);
89*5e7646d2SAndroid Build Coastguard Worker }
90*5e7646d2SAndroid Build Coastguard Worker
91*5e7646d2SAndroid Build Coastguard Worker
92*5e7646d2SAndroid Build Coastguard Worker /*
93*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirOpen()' - Open a directory.
94*5e7646d2SAndroid Build Coastguard Worker *
95*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
96*5e7646d2SAndroid Build Coastguard Worker */
97*5e7646d2SAndroid Build Coastguard Worker
98*5e7646d2SAndroid Build Coastguard Worker cups_dir_t * /* O - Directory pointer or @code NULL@ if the directory could not be opened. */
cupsDirOpen(const char * directory)99*5e7646d2SAndroid Build Coastguard Worker cupsDirOpen(const char *directory) /* I - Directory name */
100*5e7646d2SAndroid Build Coastguard Worker {
101*5e7646d2SAndroid Build Coastguard Worker cups_dir_t *dp; /* Directory */
102*5e7646d2SAndroid Build Coastguard Worker
103*5e7646d2SAndroid Build Coastguard Worker
104*5e7646d2SAndroid Build Coastguard Worker /*
105*5e7646d2SAndroid Build Coastguard Worker * Range check input...
106*5e7646d2SAndroid Build Coastguard Worker */
107*5e7646d2SAndroid Build Coastguard Worker
108*5e7646d2SAndroid Build Coastguard Worker if (!directory)
109*5e7646d2SAndroid Build Coastguard Worker return (NULL);
110*5e7646d2SAndroid Build Coastguard Worker
111*5e7646d2SAndroid Build Coastguard Worker /*
112*5e7646d2SAndroid Build Coastguard Worker * Allocate memory for the directory structure...
113*5e7646d2SAndroid Build Coastguard Worker */
114*5e7646d2SAndroid Build Coastguard Worker
115*5e7646d2SAndroid Build Coastguard Worker dp = (cups_dir_t *)calloc(1, sizeof(cups_dir_t));
116*5e7646d2SAndroid Build Coastguard Worker if (!dp)
117*5e7646d2SAndroid Build Coastguard Worker return (NULL);
118*5e7646d2SAndroid Build Coastguard Worker
119*5e7646d2SAndroid Build Coastguard Worker /*
120*5e7646d2SAndroid Build Coastguard Worker * Copy the directory name for later use...
121*5e7646d2SAndroid Build Coastguard Worker */
122*5e7646d2SAndroid Build Coastguard Worker
123*5e7646d2SAndroid Build Coastguard Worker dp->dir = INVALID_HANDLE_VALUE;
124*5e7646d2SAndroid Build Coastguard Worker
125*5e7646d2SAndroid Build Coastguard Worker strlcpy(dp->directory, directory, sizeof(dp->directory));
126*5e7646d2SAndroid Build Coastguard Worker
127*5e7646d2SAndroid Build Coastguard Worker /*
128*5e7646d2SAndroid Build Coastguard Worker * Return the new directory structure...
129*5e7646d2SAndroid Build Coastguard Worker */
130*5e7646d2SAndroid Build Coastguard Worker
131*5e7646d2SAndroid Build Coastguard Worker return (dp);
132*5e7646d2SAndroid Build Coastguard Worker }
133*5e7646d2SAndroid Build Coastguard Worker
134*5e7646d2SAndroid Build Coastguard Worker
135*5e7646d2SAndroid Build Coastguard Worker /*
136*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirRead()' - Read the next directory entry.
137*5e7646d2SAndroid Build Coastguard Worker *
138*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
139*5e7646d2SAndroid Build Coastguard Worker */
140*5e7646d2SAndroid Build Coastguard Worker
141*5e7646d2SAndroid Build Coastguard Worker cups_dentry_t * /* O - Directory entry or @code NULL@ if there are no more */
cupsDirRead(cups_dir_t * dp)142*5e7646d2SAndroid Build Coastguard Worker cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */
143*5e7646d2SAndroid Build Coastguard Worker {
144*5e7646d2SAndroid Build Coastguard Worker WIN32_FIND_DATAA entry; /* Directory entry data */
145*5e7646d2SAndroid Build Coastguard Worker
146*5e7646d2SAndroid Build Coastguard Worker
147*5e7646d2SAndroid Build Coastguard Worker /*
148*5e7646d2SAndroid Build Coastguard Worker * Range check input...
149*5e7646d2SAndroid Build Coastguard Worker */
150*5e7646d2SAndroid Build Coastguard Worker
151*5e7646d2SAndroid Build Coastguard Worker if (!dp)
152*5e7646d2SAndroid Build Coastguard Worker return (NULL);
153*5e7646d2SAndroid Build Coastguard Worker
154*5e7646d2SAndroid Build Coastguard Worker /*
155*5e7646d2SAndroid Build Coastguard Worker * See if we have already started finding files...
156*5e7646d2SAndroid Build Coastguard Worker */
157*5e7646d2SAndroid Build Coastguard Worker
158*5e7646d2SAndroid Build Coastguard Worker if (dp->dir == INVALID_HANDLE_VALUE)
159*5e7646d2SAndroid Build Coastguard Worker {
160*5e7646d2SAndroid Build Coastguard Worker /*
161*5e7646d2SAndroid Build Coastguard Worker * No, find the first file...
162*5e7646d2SAndroid Build Coastguard Worker */
163*5e7646d2SAndroid Build Coastguard Worker
164*5e7646d2SAndroid Build Coastguard Worker dp->dir = FindFirstFileA(dp->directory, &entry);
165*5e7646d2SAndroid Build Coastguard Worker if (dp->dir == INVALID_HANDLE_VALUE)
166*5e7646d2SAndroid Build Coastguard Worker return (NULL);
167*5e7646d2SAndroid Build Coastguard Worker }
168*5e7646d2SAndroid Build Coastguard Worker else if (!FindNextFileA(dp->dir, &entry))
169*5e7646d2SAndroid Build Coastguard Worker return (NULL);
170*5e7646d2SAndroid Build Coastguard Worker
171*5e7646d2SAndroid Build Coastguard Worker /*
172*5e7646d2SAndroid Build Coastguard Worker * Copy the name over and convert the file information...
173*5e7646d2SAndroid Build Coastguard Worker */
174*5e7646d2SAndroid Build Coastguard Worker
175*5e7646d2SAndroid Build Coastguard Worker strlcpy(dp->entry.filename, entry.cFileName, sizeof(dp->entry.filename));
176*5e7646d2SAndroid Build Coastguard Worker
177*5e7646d2SAndroid Build Coastguard Worker if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
178*5e7646d2SAndroid Build Coastguard Worker dp->entry.fileinfo.st_mode = 0755 | S_IFDIR;
179*5e7646d2SAndroid Build Coastguard Worker else
180*5e7646d2SAndroid Build Coastguard Worker dp->entry.fileinfo.st_mode = 0644;
181*5e7646d2SAndroid Build Coastguard Worker
182*5e7646d2SAndroid Build Coastguard Worker dp->entry.fileinfo.st_atime = _cups_dir_time(entry.ftLastAccessTime);
183*5e7646d2SAndroid Build Coastguard Worker dp->entry.fileinfo.st_ctime = _cups_dir_time(entry.ftCreationTime);
184*5e7646d2SAndroid Build Coastguard Worker dp->entry.fileinfo.st_mtime = _cups_dir_time(entry.ftLastWriteTime);
185*5e7646d2SAndroid Build Coastguard Worker dp->entry.fileinfo.st_size = entry.nFileSizeLow + ((unsigned long long)entry.nFileSizeHigh << 32);
186*5e7646d2SAndroid Build Coastguard Worker
187*5e7646d2SAndroid Build Coastguard Worker /*
188*5e7646d2SAndroid Build Coastguard Worker * Return the entry...
189*5e7646d2SAndroid Build Coastguard Worker */
190*5e7646d2SAndroid Build Coastguard Worker
191*5e7646d2SAndroid Build Coastguard Worker return (&(dp->entry));
192*5e7646d2SAndroid Build Coastguard Worker }
193*5e7646d2SAndroid Build Coastguard Worker
194*5e7646d2SAndroid Build Coastguard Worker
195*5e7646d2SAndroid Build Coastguard Worker /*
196*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirRewind()' - Rewind to the start of the directory.
197*5e7646d2SAndroid Build Coastguard Worker *
198*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
199*5e7646d2SAndroid Build Coastguard Worker */
200*5e7646d2SAndroid Build Coastguard Worker
201*5e7646d2SAndroid Build Coastguard Worker void
cupsDirRewind(cups_dir_t * dp)202*5e7646d2SAndroid Build Coastguard Worker cupsDirRewind(cups_dir_t *dp) /* I - Directory pointer */
203*5e7646d2SAndroid Build Coastguard Worker {
204*5e7646d2SAndroid Build Coastguard Worker /*
205*5e7646d2SAndroid Build Coastguard Worker * Range check input...
206*5e7646d2SAndroid Build Coastguard Worker */
207*5e7646d2SAndroid Build Coastguard Worker
208*5e7646d2SAndroid Build Coastguard Worker if (!dp)
209*5e7646d2SAndroid Build Coastguard Worker return;
210*5e7646d2SAndroid Build Coastguard Worker
211*5e7646d2SAndroid Build Coastguard Worker /*
212*5e7646d2SAndroid Build Coastguard Worker * Close an open directory handle...
213*5e7646d2SAndroid Build Coastguard Worker */
214*5e7646d2SAndroid Build Coastguard Worker
215*5e7646d2SAndroid Build Coastguard Worker if (dp->dir != INVALID_HANDLE_VALUE)
216*5e7646d2SAndroid Build Coastguard Worker {
217*5e7646d2SAndroid Build Coastguard Worker FindClose(dp->dir);
218*5e7646d2SAndroid Build Coastguard Worker dp->dir = INVALID_HANDLE_VALUE;
219*5e7646d2SAndroid Build Coastguard Worker }
220*5e7646d2SAndroid Build Coastguard Worker }
221*5e7646d2SAndroid Build Coastguard Worker
222*5e7646d2SAndroid Build Coastguard Worker
223*5e7646d2SAndroid Build Coastguard Worker #else
224*5e7646d2SAndroid Build Coastguard Worker
225*5e7646d2SAndroid Build Coastguard Worker /*
226*5e7646d2SAndroid Build Coastguard Worker * POSIX implementation...
227*5e7646d2SAndroid Build Coastguard Worker */
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker # include <sys/types.h>
230*5e7646d2SAndroid Build Coastguard Worker # include <dirent.h>
231*5e7646d2SAndroid Build Coastguard Worker
232*5e7646d2SAndroid Build Coastguard Worker
233*5e7646d2SAndroid Build Coastguard Worker /*
234*5e7646d2SAndroid Build Coastguard Worker * Types and structures...
235*5e7646d2SAndroid Build Coastguard Worker */
236*5e7646d2SAndroid Build Coastguard Worker
237*5e7646d2SAndroid Build Coastguard Worker struct _cups_dir_s /**** Directory data structure ****/
238*5e7646d2SAndroid Build Coastguard Worker {
239*5e7646d2SAndroid Build Coastguard Worker char directory[1024]; /* Directory filename */
240*5e7646d2SAndroid Build Coastguard Worker DIR *dir; /* Directory file */
241*5e7646d2SAndroid Build Coastguard Worker cups_dentry_t entry; /* Directory entry */
242*5e7646d2SAndroid Build Coastguard Worker };
243*5e7646d2SAndroid Build Coastguard Worker
244*5e7646d2SAndroid Build Coastguard Worker
245*5e7646d2SAndroid Build Coastguard Worker /*
246*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirClose()' - Close a directory.
247*5e7646d2SAndroid Build Coastguard Worker *
248*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
249*5e7646d2SAndroid Build Coastguard Worker */
250*5e7646d2SAndroid Build Coastguard Worker
251*5e7646d2SAndroid Build Coastguard Worker void
cupsDirClose(cups_dir_t * dp)252*5e7646d2SAndroid Build Coastguard Worker cupsDirClose(cups_dir_t *dp) /* I - Directory pointer */
253*5e7646d2SAndroid Build Coastguard Worker {
254*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsDirClose(dp=%p)", (void *)dp));
255*5e7646d2SAndroid Build Coastguard Worker
256*5e7646d2SAndroid Build Coastguard Worker /*
257*5e7646d2SAndroid Build Coastguard Worker * Range check input...
258*5e7646d2SAndroid Build Coastguard Worker */
259*5e7646d2SAndroid Build Coastguard Worker
260*5e7646d2SAndroid Build Coastguard Worker if (!dp)
261*5e7646d2SAndroid Build Coastguard Worker return;
262*5e7646d2SAndroid Build Coastguard Worker
263*5e7646d2SAndroid Build Coastguard Worker /*
264*5e7646d2SAndroid Build Coastguard Worker * Close the directory and free memory...
265*5e7646d2SAndroid Build Coastguard Worker */
266*5e7646d2SAndroid Build Coastguard Worker
267*5e7646d2SAndroid Build Coastguard Worker closedir(dp->dir);
268*5e7646d2SAndroid Build Coastguard Worker free(dp);
269*5e7646d2SAndroid Build Coastguard Worker }
270*5e7646d2SAndroid Build Coastguard Worker
271*5e7646d2SAndroid Build Coastguard Worker
272*5e7646d2SAndroid Build Coastguard Worker /*
273*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirOpen()' - Open a directory.
274*5e7646d2SAndroid Build Coastguard Worker *
275*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
276*5e7646d2SAndroid Build Coastguard Worker */
277*5e7646d2SAndroid Build Coastguard Worker
278*5e7646d2SAndroid Build Coastguard Worker cups_dir_t * /* O - Directory pointer or @code NULL@ if the directory could not be opened. */
cupsDirOpen(const char * directory)279*5e7646d2SAndroid Build Coastguard Worker cupsDirOpen(const char *directory) /* I - Directory name */
280*5e7646d2SAndroid Build Coastguard Worker {
281*5e7646d2SAndroid Build Coastguard Worker cups_dir_t *dp; /* Directory */
282*5e7646d2SAndroid Build Coastguard Worker
283*5e7646d2SAndroid Build Coastguard Worker
284*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsDirOpen(directory=\"%s\")", directory));
285*5e7646d2SAndroid Build Coastguard Worker
286*5e7646d2SAndroid Build Coastguard Worker /*
287*5e7646d2SAndroid Build Coastguard Worker * Range check input...
288*5e7646d2SAndroid Build Coastguard Worker */
289*5e7646d2SAndroid Build Coastguard Worker
290*5e7646d2SAndroid Build Coastguard Worker if (!directory)
291*5e7646d2SAndroid Build Coastguard Worker return (NULL);
292*5e7646d2SAndroid Build Coastguard Worker
293*5e7646d2SAndroid Build Coastguard Worker /*
294*5e7646d2SAndroid Build Coastguard Worker * Allocate memory for the directory structure...
295*5e7646d2SAndroid Build Coastguard Worker */
296*5e7646d2SAndroid Build Coastguard Worker
297*5e7646d2SAndroid Build Coastguard Worker dp = (cups_dir_t *)calloc(1, sizeof(cups_dir_t));
298*5e7646d2SAndroid Build Coastguard Worker if (!dp)
299*5e7646d2SAndroid Build Coastguard Worker return (NULL);
300*5e7646d2SAndroid Build Coastguard Worker
301*5e7646d2SAndroid Build Coastguard Worker /*
302*5e7646d2SAndroid Build Coastguard Worker * Open the directory...
303*5e7646d2SAndroid Build Coastguard Worker */
304*5e7646d2SAndroid Build Coastguard Worker
305*5e7646d2SAndroid Build Coastguard Worker dp->dir = opendir(directory);
306*5e7646d2SAndroid Build Coastguard Worker if (!dp->dir)
307*5e7646d2SAndroid Build Coastguard Worker {
308*5e7646d2SAndroid Build Coastguard Worker free(dp);
309*5e7646d2SAndroid Build Coastguard Worker return (NULL);
310*5e7646d2SAndroid Build Coastguard Worker }
311*5e7646d2SAndroid Build Coastguard Worker
312*5e7646d2SAndroid Build Coastguard Worker /*
313*5e7646d2SAndroid Build Coastguard Worker * Copy the directory name for later use...
314*5e7646d2SAndroid Build Coastguard Worker */
315*5e7646d2SAndroid Build Coastguard Worker
316*5e7646d2SAndroid Build Coastguard Worker strlcpy(dp->directory, directory, sizeof(dp->directory));
317*5e7646d2SAndroid Build Coastguard Worker
318*5e7646d2SAndroid Build Coastguard Worker /*
319*5e7646d2SAndroid Build Coastguard Worker * Return the new directory structure...
320*5e7646d2SAndroid Build Coastguard Worker */
321*5e7646d2SAndroid Build Coastguard Worker
322*5e7646d2SAndroid Build Coastguard Worker return (dp);
323*5e7646d2SAndroid Build Coastguard Worker }
324*5e7646d2SAndroid Build Coastguard Worker
325*5e7646d2SAndroid Build Coastguard Worker
326*5e7646d2SAndroid Build Coastguard Worker /*
327*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirRead()' - Read the next directory entry.
328*5e7646d2SAndroid Build Coastguard Worker *
329*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
330*5e7646d2SAndroid Build Coastguard Worker */
331*5e7646d2SAndroid Build Coastguard Worker
332*5e7646d2SAndroid Build Coastguard Worker cups_dentry_t * /* O - Directory entry or @code NULL@ when there are no more */
cupsDirRead(cups_dir_t * dp)333*5e7646d2SAndroid Build Coastguard Worker cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */
334*5e7646d2SAndroid Build Coastguard Worker {
335*5e7646d2SAndroid Build Coastguard Worker struct dirent *entry; /* Pointer to entry */
336*5e7646d2SAndroid Build Coastguard Worker char filename[1024]; /* Full filename */
337*5e7646d2SAndroid Build Coastguard Worker
338*5e7646d2SAndroid Build Coastguard Worker
339*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("2cupsDirRead(dp=%p)", (void *)dp));
340*5e7646d2SAndroid Build Coastguard Worker
341*5e7646d2SAndroid Build Coastguard Worker /*
342*5e7646d2SAndroid Build Coastguard Worker * Range check input...
343*5e7646d2SAndroid Build Coastguard Worker */
344*5e7646d2SAndroid Build Coastguard Worker
345*5e7646d2SAndroid Build Coastguard Worker if (!dp)
346*5e7646d2SAndroid Build Coastguard Worker return (NULL);
347*5e7646d2SAndroid Build Coastguard Worker
348*5e7646d2SAndroid Build Coastguard Worker /*
349*5e7646d2SAndroid Build Coastguard Worker * Try reading an entry that is not "." or ".."...
350*5e7646d2SAndroid Build Coastguard Worker */
351*5e7646d2SAndroid Build Coastguard Worker
352*5e7646d2SAndroid Build Coastguard Worker for (;;)
353*5e7646d2SAndroid Build Coastguard Worker {
354*5e7646d2SAndroid Build Coastguard Worker /*
355*5e7646d2SAndroid Build Coastguard Worker * Read the next entry...
356*5e7646d2SAndroid Build Coastguard Worker */
357*5e7646d2SAndroid Build Coastguard Worker
358*5e7646d2SAndroid Build Coastguard Worker if ((entry = readdir(dp->dir)) == NULL)
359*5e7646d2SAndroid Build Coastguard Worker {
360*5e7646d2SAndroid Build Coastguard Worker DEBUG_puts("3cupsDirRead: readdir() returned a NULL pointer!");
361*5e7646d2SAndroid Build Coastguard Worker return (NULL);
362*5e7646d2SAndroid Build Coastguard Worker }
363*5e7646d2SAndroid Build Coastguard Worker
364*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("4cupsDirRead: readdir() returned \"%s\"...", entry->d_name));
365*5e7646d2SAndroid Build Coastguard Worker
366*5e7646d2SAndroid Build Coastguard Worker /*
367*5e7646d2SAndroid Build Coastguard Worker * Skip "." and ".."...
368*5e7646d2SAndroid Build Coastguard Worker */
369*5e7646d2SAndroid Build Coastguard Worker
370*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
371*5e7646d2SAndroid Build Coastguard Worker continue;
372*5e7646d2SAndroid Build Coastguard Worker
373*5e7646d2SAndroid Build Coastguard Worker /*
374*5e7646d2SAndroid Build Coastguard Worker * Copy the name over and get the file information...
375*5e7646d2SAndroid Build Coastguard Worker */
376*5e7646d2SAndroid Build Coastguard Worker
377*5e7646d2SAndroid Build Coastguard Worker strlcpy(dp->entry.filename, entry->d_name, sizeof(dp->entry.filename));
378*5e7646d2SAndroid Build Coastguard Worker
379*5e7646d2SAndroid Build Coastguard Worker snprintf(filename, sizeof(filename), "%s/%s", dp->directory, entry->d_name);
380*5e7646d2SAndroid Build Coastguard Worker
381*5e7646d2SAndroid Build Coastguard Worker if (stat(filename, &(dp->entry.fileinfo)))
382*5e7646d2SAndroid Build Coastguard Worker {
383*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("3cupsDirRead: stat() failed for \"%s\" - %s...", filename,
384*5e7646d2SAndroid Build Coastguard Worker strerror(errno)));
385*5e7646d2SAndroid Build Coastguard Worker continue;
386*5e7646d2SAndroid Build Coastguard Worker }
387*5e7646d2SAndroid Build Coastguard Worker
388*5e7646d2SAndroid Build Coastguard Worker /*
389*5e7646d2SAndroid Build Coastguard Worker * Return the entry...
390*5e7646d2SAndroid Build Coastguard Worker */
391*5e7646d2SAndroid Build Coastguard Worker
392*5e7646d2SAndroid Build Coastguard Worker return (&(dp->entry));
393*5e7646d2SAndroid Build Coastguard Worker }
394*5e7646d2SAndroid Build Coastguard Worker }
395*5e7646d2SAndroid Build Coastguard Worker
396*5e7646d2SAndroid Build Coastguard Worker
397*5e7646d2SAndroid Build Coastguard Worker /*
398*5e7646d2SAndroid Build Coastguard Worker * 'cupsDirRewind()' - Rewind to the start of the directory.
399*5e7646d2SAndroid Build Coastguard Worker *
400*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
401*5e7646d2SAndroid Build Coastguard Worker */
402*5e7646d2SAndroid Build Coastguard Worker
403*5e7646d2SAndroid Build Coastguard Worker void
cupsDirRewind(cups_dir_t * dp)404*5e7646d2SAndroid Build Coastguard Worker cupsDirRewind(cups_dir_t *dp) /* I - Directory pointer */
405*5e7646d2SAndroid Build Coastguard Worker {
406*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("cupsDirRewind(dp=%p)", (void *)dp));
407*5e7646d2SAndroid Build Coastguard Worker
408*5e7646d2SAndroid Build Coastguard Worker /*
409*5e7646d2SAndroid Build Coastguard Worker * Range check input...
410*5e7646d2SAndroid Build Coastguard Worker */
411*5e7646d2SAndroid Build Coastguard Worker
412*5e7646d2SAndroid Build Coastguard Worker if (!dp)
413*5e7646d2SAndroid Build Coastguard Worker return;
414*5e7646d2SAndroid Build Coastguard Worker
415*5e7646d2SAndroid Build Coastguard Worker /*
416*5e7646d2SAndroid Build Coastguard Worker * Rewind the directory...
417*5e7646d2SAndroid Build Coastguard Worker */
418*5e7646d2SAndroid Build Coastguard Worker
419*5e7646d2SAndroid Build Coastguard Worker rewinddir(dp->dir);
420*5e7646d2SAndroid Build Coastguard Worker }
421*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
422