Nilorea Library
C utilities for networking, threading, graphics
n_files.c
Go to the documentation of this file.
1
8#include "nilorea/n_files.h"
9
10
15void n_free_file_info( void *ptr )
16{
17 __n_assert( ptr , return );
18 N_FILE_INFO *file = (N_FILE_INFO *)ptr ;
19 if( file -> name )
20 free( file -> name );
21 free(file);
22 return ;
23}
24
31static int n_comp_file_info( const void *a , const void *b )
32{
33 N_FILE_INFO *f1 , *f2 ;
34
35 f1=(N_FILE_INFO *)a ;
36 f2=(N_FILE_INFO *)b ;
37
38 int ret = -1 ;
39
40 if( !f1 )
41 {
42 return -1 ;
43 }
44 if( !f2 )
45 {
46 return 1 ;
47 }
48
49 if( f1 -> filetime < f2 -> filetime )
50 {
51 ret = -1 ;
52 }
53 else if( f1 -> filetime == f2 -> filetime )
54 {
55 if( f1 -> filetime_nsec < f2 -> filetime_nsec )
56 {
57 ret = -1 ;
58 }
59 else if( f1 -> filetime_nsec > f2 -> filetime_nsec )
60 {
61 ret = 1 ;
62 }
63 }
64 else if( f1 -> filetime > f2 -> filetime )
65 {
66 ret = 1 ;
67 }
68
69 return ret ;
70}
71
82int n_scan_dir( const char *dir, LIST *result , const int recurse )
83{
84 DIR *dp = NULL ;
85 struct dirent *entry = NULL;
86 struct stat statbuf;
87
88 __n_assert( dir , return FALSE );
89 __n_assert( result , return FALSE );
90
91 if( ( dp = opendir( dir ) ) == NULL )
92 {
93 n_log( LOG_ERR , dir ,"cannot open directory: %s, %s" , dir , strerror( errno ) );
94 return FALSE ;
95 }
96 if( chdir( dir ) == -1 )
97 {
98 n_log( LOG_ERR , dir , "cannot chdir to directory %s, %s" , dir , strerror( errno ) );
99 closedir( dp );
100 return FALSE ;
101 }
102 errno=0;
103 while( ( entry = readdir( dp ) ) != NULL )
104 {
105 if( stat( entry -> d_name , &statbuf ) != -1 )
106 {
107 if( S_ISDIR( statbuf . st_mode ) )
108 {
109 if( strcmp( "." , entry -> d_name ) == 0 || strcmp( ".." , entry -> d_name ) == 0 )
110 {
111 continue;
112 }
113 /* Recurse */
114 if( recurse != FALSE )
115 {
116 if( n_scan_dir( entry -> d_name , result, recurse ) == FALSE )
117 {
118 n_log( LOG_ERR , entry -> d_name , "error while recursively scanning %s" , entry -> d_name );
119 }
120 }
121 }
122 else if( S_ISREG( statbuf . st_mode ) )
123 {
124 N_FILE_INFO *file = NULL ;
125 Malloc( file , N_FILE_INFO , 1 );
126 file -> name = strdup( entry -> d_name );
127#ifdef XLINUX
128 file -> filetime = statbuf . st_mtime ;
129 file -> filetime_nsec = statbuf . st_mtimensec ;
130#elif defined SOLARIS
131 file -> filetime = statbuf . st_mtim . tv_sec ;
132 file -> filetime_nsec = statbuf . st_mtim . tv_nsec ;
133#else
134 file -> filetime = statbuf . st_mtime ;
135 file -> filetime_nsec = 0 ;
136#endif
137
139 }
140 else
141 {
142 n_log( LOG_ERR , "Not a S_ISDIR or S_ISREG file: %s" , entry -> d_name );
143 }
144 }
145 else
146 {
147 n_log( LOG_ERR , "unable to stat %s, %s" , entry -> d_name , strerror( errno ) );
148 }
149 }
150 if( errno != 0 )
151 {
152 n_log( LOG_ERR , "readdir failed: %s" , strerror( errno ) );
153 }
154 closedir( dp );
155 return TRUE ;
156}
157
158
159
#define Malloc(__ptr, __struct, __size)
Malloc Handler to get errors and set to 0.
Definition: n_common.h:183
#define __n_assert(__ptr, __ret)
macro to assert things
Definition: n_common.h:276
int list_push_sorted(LIST *list, void *ptr, int(*comparator)(const void *a, const void *b), void(*destructor)(void *ptr))
Add a pointer sorted in the list , starting by the end of the list.
Definition: n_list.c:285
Structure of a generic LIST container.
Definition: n_list.h:45
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
Definition: n_log.h:74
#define LOG_ERR
error conditions
Definition: n_log.h:58
int n_scan_dir(const char *dir, LIST *result, const int recurse)
Scan given directory and return a LIST of char.
Definition: n_files.c:82
void n_free_file_info(void *ptr)
free a N_FILE_INFO struct
Definition: n_files.c:15
common file information
Definition: n_files.h:32
static int n_comp_file_info(const void *a, const void *b)
local comparison function for sorting filenames, case insensitive
Definition: n_files.c:31
files configuration header