00001 #include <eh_utils.h> 00002 00003 FILE* 00004 eh_fopen(const char *filename, const char *type) 00005 { 00006 FILE *fp; 00007 00008 eh_require( filename!=NULL ); 00009 00010 fp = fopen(filename,type); 00011 if ( !fp ) 00012 { 00013 g_error( "eh_fopen: could not open file: %s" , filename ); 00014 fp = NULL; 00015 } 00016 00017 return fp; 00018 } 00019 00020 #include <errno.h> 00021 00022 gchar* 00023 eh_render_file_error_str( gint err_no ) 00024 { 00025 gchar* err_str = NULL; 00026 00027 if ( err_no!=0 ) 00028 { 00029 GFileError file_error = g_file_error_from_errno( err_no ); 00030 00031 switch ( file_error ) 00032 { 00033 case G_FILE_ERROR_EXIST: 00034 err_str = g_strdup( "Operation not permitted" ); break; 00035 case G_FILE_ERROR_ISDIR: 00036 err_str = g_strdup( "File is a directory" ); break; 00037 case G_FILE_ERROR_ACCES: 00038 err_str = g_strdup( "Permission denied" ); break; 00039 case G_FILE_ERROR_NAMETOOLONG: 00040 err_str = g_strdup( "Filename too long" ); break; 00041 case G_FILE_ERROR_NOENT: 00042 err_str = g_strdup( "No such file or directory" ); break; 00043 case G_FILE_ERROR_NOTDIR: 00044 err_str = g_strdup( "Not a directory" ); break; 00045 case G_FILE_ERROR_NXIO: 00046 err_str = g_strdup( "No such device or address" ); break; 00047 case G_FILE_ERROR_NODEV: 00048 err_str = g_strdup( "No such device" ); break; 00049 case G_FILE_ERROR_ROFS: 00050 err_str = g_strdup( "Read-only file system" ); break; 00051 case G_FILE_ERROR_TXTBSY: 00052 err_str = g_strdup( "Text file busy" ); break; 00053 case G_FILE_ERROR_FAULT: 00054 err_str = g_strdup( "Pointer to bad memory" ); break; 00055 case G_FILE_ERROR_LOOP: 00056 err_str = g_strdup( "Too many levels of symbolic links" ); break; 00057 case G_FILE_ERROR_NOSPC: 00058 err_str = g_strdup( "No space left on device" ); break; 00059 case G_FILE_ERROR_NOMEM: 00060 err_str = g_strdup( "No memory available" ); break; 00061 case G_FILE_ERROR_MFILE: 00062 err_str = g_strdup( "The current process has too many open files" ); break; 00063 case G_FILE_ERROR_NFILE: 00064 err_str = g_strdup( "The entire system has too many open files" ); break; 00065 case G_FILE_ERROR_BADF: 00066 err_str = g_strdup( "Bad file descriptor" ); break; 00067 case G_FILE_ERROR_INVAL: 00068 err_str = g_strdup( "Invalid argument" ); break; 00069 case G_FILE_ERROR_PIPE: 00070 err_str = g_strdup( "Broken pipe" ); break; 00071 case G_FILE_ERROR_AGAIN: 00072 err_str = g_strdup( "Resource temporarily unavailable" ); break; 00073 case G_FILE_ERROR_INTR: 00074 err_str = g_strdup( "Interrupted function call" ); break; 00075 case G_FILE_ERROR_IO: 00076 err_str = g_strdup( "Input/output error" ); break; 00077 case G_FILE_ERROR_PERM: 00078 err_str = g_strdup( "Output not permitted" ); break; 00079 case G_FILE_ERROR_NOSYS: 00080 err_str = g_strdup( "Function not implemented" ); break; 00081 case G_FILE_ERROR_FAILED: 00082 err_str = g_strdup( "Error unknown" ); break; 00083 } 00084 } 00085 00086 return err_str; 00087 } 00088 00089 FILE* 00090 eh_fopen_error( const char* file , const char* type , GError** error ) 00091 { 00092 FILE* fp = NULL; 00093 00094 eh_return_val_if_fail( error==NULL || *error==NULL , NULL ); 00095 00096 fp = fopen( file , type ); 00097 00098 if ( !fp ) 00099 { 00100 GError* tmp_err = NULL; 00101 eh_set_file_error_from_errno( &tmp_err , file , errno ); 00102 g_propagate_error( error , tmp_err ); 00103 } 00104 00105 return fp; 00106 } 00107 00108 void 00109 eh_set_file_error_from_errno( GError** error , const gchar* file , gint err_no ) 00110 { 00111 if ( error ) 00112 { 00113 eh_return_if_fail( *error==NULL ); 00114 00115 if ( err_no!=0 ) 00116 { 00117 gchar* err_str = eh_render_file_error_str( err_no ); 00118 if ( file ) 00119 g_set_error( error , 00120 G_FILE_ERROR , 00121 g_file_error_from_errno(err_no) , 00122 "%s: %s" , file , err_str ); 00123 else 00124 g_set_error( error , 00125 G_FILE_ERROR , 00126 g_file_error_from_errno(err_no) , 00127 "%s" , err_str ); 00128 eh_free( err_str ); 00129 } 00130 } 00131 00132 return; 00133 } 00134 00135 FILE* 00136 eh_open_file( const char *filename , const char *type ) 00137 { 00138 FILE *fp; 00139 if ( filename ) 00140 fp = eh_fopen( filename , type ); 00141 else 00142 fp = stdin; 00143 00144 return fp; 00145 } 00146 00147 FILE* 00148 eh_open_temp_file( const char *template , char **name_used ) 00149 { 00150 GError *error; 00151 int fd = g_file_open_tmp( template , name_used , &error ); 00152 return fdopen( fd , "w+" ); 00153 } 00154 00155 #include <fcntl.h> 00156 #include <unistd.h> 00157 #include <errno.h> 00158 00159 gboolean 00160 eh_is_readable_file( const char* filename ) 00161 { 00162 FILE *fp = fopen( filename , "r" ); 00163 if ( fp ) 00164 { 00165 fclose(fp); 00166 return TRUE; 00167 } 00168 else 00169 return FALSE; 00170 } 00171 00172 gboolean 00173 eh_is_writable_file( const char* filename ) 00174 { 00175 FILE *fp = fopen( filename , "a" ); 00176 if ( fp ) 00177 { 00178 fclose(fp); 00179 return TRUE; 00180 } 00181 else 00182 return FALSE; 00183 } 00184 00185 #include <glib/gstdio.h> 00186 00187 gboolean 00188 eh_try_open( const char* file ) 00189 { 00190 gboolean open_ok = FALSE; 00191 00192 if ( file ) 00193 { 00194 if ( g_file_test( file , G_FILE_TEST_EXISTS ) ) 00195 open_ok = TRUE; 00196 else 00197 { 00198 char* dir = g_path_get_dirname( file ); 00199 00200 open_ok = eh_open_dir( dir , NULL ); 00201 00202 eh_free( dir ); 00203 } 00204 } 00205 00206 return open_ok; 00207 } 00208 00209 gboolean 00210 eh_open_dir( const char* dir , GError** error ) 00211 { 00212 gboolean open_ok = TRUE; 00213 00214 eh_require( dir ); 00215 eh_return_val_if_fail( error==NULL || *error==NULL , FALSE ); 00216 00217 if ( dir ) 00218 { 00219 if ( g_mkdir_with_parents( dir , S_ISUID|S_ISGID|S_IRWXU|S_IRWXG )!=0 ) 00220 { 00221 GError* tmp_err = NULL; 00222 eh_set_file_error_from_errno( &tmp_err , dir , errno ); 00223 g_propagate_error( error , tmp_err ); 00224 open_ok = FALSE; 00225 } 00226 } 00227 00228 return open_ok; 00229 } 00230 00231 gboolean 00232 try_open(const char *filename, int flags) 00233 { 00234 int fd = open(filename,flags,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH); 00235 if ( fd < 0 ) 00236 { 00237 fprintf(stderr,"warning : try_open : %s : %s\n",strerror(errno),filename); 00238 return FALSE; 00239 } 00240 else 00241 { 00242 close(fd); 00243 return TRUE; 00244 } 00245 } 00246 00247 gboolean 00248 eh_touch_file( const gchar* file , int flags , GError** error ) 00249 { 00250 gboolean is_ok = TRUE; 00251 00252 eh_require( file ); 00253 eh_return_val_if_fail( error==NULL || *error==NULL , FALSE ); 00254 00255 if ( file ) 00256 { 00257 GError* tmp_err = NULL; 00258 gchar* dir_name = g_path_get_dirname( file ); 00259 00260 eh_open_dir( dir_name , &tmp_err ); 00261 00262 eh_free( dir_name ); 00263 00264 if ( !tmp_err ) 00265 { 00266 gint fd = g_open( file , flags , S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH ); 00267 00268 if ( fd == -1 ) 00269 eh_set_file_error_from_errno( &tmp_err , file , errno ); 00270 else 00271 close( fd ); 00272 } 00273 00274 if ( tmp_err ) 00275 { 00276 g_propagate_error( error , tmp_err ); 00277 is_ok = FALSE; 00278 } 00279 } 00280 return is_ok; 00281 } 00282 00283 #include <dirent.h> 00284 00285 gboolean 00286 try_dir( const char *file , GError **error ) 00287 { 00288 gboolean is_ok = FALSE; 00289 int fd = g_open(file,O_RDONLY); 00290 00291 if ( fd < 0 ) 00292 { 00293 GError* tmp_err = NULL; 00294 eh_set_file_error_from_errno( &tmp_err , file , errno ); 00295 g_propagate_error( error , tmp_err ); 00296 is_ok = FALSE; 00297 } 00298 else 00299 { 00300 close(fd); 00301 is_ok = TRUE; 00302 } 00303 return is_ok; 00304 } 00305 00325 Eh_file_list* 00326 eh_create_file_list( char *base_name ) 00327 { 00328 char **str_array; 00329 Eh_file_list *list; 00330 00331 list = eh_new( Eh_file_list , 1 ); 00332 00333 str_array = g_strsplit( base_name , "#" , -1 ); 00334 list->prefix = str_array[0]; 00335 list->suffix = str_array[1]; 00336 list->format = g_strdup("%04d"); 00337 list->count = 0; 00338 00339 eh_free( str_array ); 00340 00341 return list; 00342 } 00343 00352 gchar* 00353 eh_get_next_file( Eh_file_list *list ) 00354 { 00355 char *new_file; 00356 char *count; 00357 00358 count = g_strdup_printf( list->format , ++(list->count) ); 00359 new_file = g_strconcat( list->prefix , count , list->suffix , NULL ); 00360 eh_free( count ); 00361 return new_file; 00362 } 00363 00370 void 00371 eh_destroy_file_list( Eh_file_list *list ) 00372 { 00373 if ( list ) 00374 { 00375 eh_free( list->prefix ); 00376 eh_free( list->suffix ); 00377 eh_free( list->format ); 00378 eh_free( list ); 00379 } 00380 } 00381