22 #include "fileutils.h"
30 #define MAIN_ERR_PREFIX "FUTIL: "
53 static int fu_compar(
const api_posix_struct_dirent** a,
54 const api_posix_struct_dirent** b)
81 for(i = 0; i < strlen(path); ++i)
84 if(
'a' <= path[i] &&
'z' >= path[i])
continue;
85 if(
'A' <= path[i] &&
'Z' >= path[i])
continue;
87 if(
'0' <= path[i] &&
'9' >= path[i])
continue;
89 if(
'.' == path[i])
continue;
90 if(
'_' == path[i])
continue;
91 if(
'-' == path[i])
continue;
93 if(
'/' == path[i])
continue;
96 PRINT_ERROR(
"Path or pathname contains forbidden characters");
131 if(NULL == path ||
'/' != path[0])
137 while (0 != path[pos])
140 p = strchr(&path[pos], (
int)
'/');
143 len = (size_t) (p - &path[pos]);
144 pos += len + (size_t) 1;
149 len = (size_t) (&path[strlen(path)] - &path[pos]);
159 pcomp = (
char*) api_posix_malloc(pos + (
size_t) 1);
162 PRINT_ERROR(
"Can't allocate memory for path component");
165 memcpy((
void*) pcomp, (
void*) path, pos);
170 if(
'/' == pcomp[pos - (
size_t) 1])
172 pcomp[pos - (size_t) 1] = 0;
177 rv = api_posix_mkdir(pcomp, perm);
178 if(!(0 == rv || (-1 == rv && API_POSIX_EEXIST == api_posix_errno)))
183 api_posix_free((
void*) pcomp);
217 api_posix_struct_stat stat_dummy;
219 if(NULL == state) { res = api_posix_stat(pathname, &stat_dummy); }
220 else { res = api_posix_stat(pathname, state); }
247 api_posix_mode_t perm)
253 do { *filedesc = api_posix_open(pathname, mode, perm); }
254 while(-1 == *filedesc && API_POSIX_EINTR == api_posix_errno);
265 rv = api_posix_fcntl(*filedesc, API_POSIX_F_SETFD,
266 API_POSIX_FD_CLOEXEC);
268 while(-1 == rv && API_POSIX_EINTR == api_posix_errno);
272 api_posix_close(*filedesc);
302 if (NULL != *stream) { fclose(*stream); }
307 if (NULL == stream && NULL != filedesc)
309 if (-1 != *filedesc) { api_posix_close(*filedesc); }
311 if (NULL != filedesc) { *filedesc = -1; }
338 api_posix_struct_flock fl;
340 fl.l_type = API_POSIX_F_WRLCK;
341 fl.l_whence = API_POSIX_SEEK_SET;
344 res = api_posix_fcntl(filedesc, API_POSIX_F_SETLK, &fl);
364 return(api_posix_unlink(pathname));
384 *stream = api_posix_fdopen(filedesc, mode);
416 do { res = fflush(stream); }
417 while(EOF == res && API_POSIX_EINTR == api_posix_errno);
423 do { res = api_posix_fsync(filedesc); }
424 while(-1 == res && API_POSIX_EINTR == api_posix_errno);
457 api_posix_ssize_t rv;
463 if(i + (
size_t) 1 >= *len)
466 if(!*len) { *len = 256; }
467 p = api_posix_realloc((
void*) *buffer, *len *= (
size_t) 2);
468 if(NULL == p) {
break; }
469 else { *buffer = p; }
472 rv = api_posix_read(filedesc, &(*buffer)[i], *len - i - (
size_t) 1);
473 if(-1 == rv && API_POSIX_EINTR == api_posix_errno) {
continue; }
474 if(-1 == rv) {
break; }
475 else { i += (size_t) rv; }
477 if(!rv) { (*buffer)[i] = 0; res = 0;
break; }
483 api_posix_free((
void*) *buffer);
514 api_posix_ssize_t rv = -1;
519 rv = api_posix_read(filedesc, (
void*) &buffer[i], *len - i);
520 if((api_posix_ssize_t) -1 == rv && API_POSIX_EINTR == api_posix_errno)
525 if((api_posix_ssize_t) -1 != rv) { i += (size_t) rv; }
else {
break; }
527 if(-1 == rv) {
PRINT_ERROR(
"Error while reading from FD"); }
555 api_posix_ssize_t rv;
560 rv = api_posix_write(filedesc, (
void*) &buffer[i], len - i);
561 if((api_posix_ssize_t) -1 == rv && API_POSIX_EINTR == api_posix_errno)
565 if((api_posix_ssize_t) -1 != rv) { i += (size_t) rv; }
else {
break; }
567 if(len == i) { res = 0; }
568 if(res) {
PRINT_ERROR(
"Writing data block to FD failed"); }
598 api_posix_struct_dirent** content;
599 api_posix_struct_stat state;
608 if(len &&
'/' == dir[0])
611 path = (
char*) api_posix_malloc(len + (
size_t) 1);
619 if(
'/' == path[len - (
size_t) 1]) { path[len - (size_t) 1] = 0; }
621 num = api_posix_scandir(path, &content, NULL, fu_compar);
622 if(0 > num) {
PRINT_ERROR(
"Cannot scan directory"); }
627 for(i = 0; i < (size_t) num; ++i)
629 entry = content[i]->d_name;
634 if(!strcmp(
".", entry)) {
continue; }
635 if(!strcmp(
"..", entry)) {
continue; }
636 pathname = (
char*) api_posix_malloc(strlen(path)
645 strcpy(pathname, path);
646 strcat(pathname,
"/");
647 strcat(pathname, entry);
649 #if CFG_USE_POSIX_API >= 200112 || CFG_USE_XSI
651 rv = api_posix_lstat(pathname, &state);
654 rv = api_posix_stat(pathname, &state);
664 if(API_POSIX_S_ISDIR(state.st_mode))
678 api_posix_free((
void*) pathname);
681 rv = api_posix_rmdir(path);
684 while(num--) { api_posix_free((
void*) content[num]); }
685 api_posix_free((
void*) content);
687 api_posix_free((
void*) path);