xref: /aosp_15_r20/external/libcups/cups/dir.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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