int __fs_open(struct _reent *r, void *fileStruct, const char *path, int flags, int mode) { int creat = 0; struct __FILE * f = (struct __FILE *)fileStruct; memset(f, 0, sizeof(struct __FILE)); int accmode = (flags & O_ACCMODE) + 1; f->filename = __path_to_native(path); f->append = (flags & O_APPEND); printf("Append Mode: %X\r\n", flags & O_APPEND); if (f->filename == NULL) { r->_errno = ENOMEM; return -1; } f->fd = sys_open(f->filename, accmode); if (f->fd >= 0) { if (flags & O_EXCL) { sys_close(f->fd); f->fd = -99; } else if ((flags & O_TRUNC) && (accmode & 0x2)) { sys_close(f->fd); sys_delete(f->filename); sys_create(f->filename, 1); f->fd = sys_open(f->filename, accmode); } } else if (f->fd == -1 && (flags & O_CREAT)) { sys_create(f->filename, 1); f->fd = sys_open(f->filename, accmode); if (f->fd == -1) f->fd = -98; printf("open with O_CREAT fd = %d\r\n", f->fd); } if (f->fd < 0) { switch(f->fd) { case -1: r->_errno = ENOENT; break; case -2: r->_errno = ENXIO; break; case -33: r->_errno = ENODEV; break; case -98: r->_errno = EISDIR; break; case -99: r->_errno = EEXIST; break; default: printf("open unknown error code %d\r\n", f->fd); r->_errno = EINVAL; } free(f->filename); f->fd = -1; } else { f->size = sys_get_filesize(f->fd); } return f->fd; }
int __fs_unlink(struct _reent *r, const char *path) { char *filename = __path_to_native(path); if (filename == NULL) { r->_errno = ENOMEM; return -1; } sys_delete(filename); free(filename); return 0; }
static void _extract(dbx_t *dbx, char *out_dir, char *eml_dir, int *saved, int *deleted, int *errors) { int no_more_messages = 0; int no_more_files = 0; char **eml_files = NULL; int num_eml_files = 0; int imessage = 0; int ifile = 0; dbx_progress_push(dbx->progress_handle, DBX_VERBOSITY_INFO, dbx->message_count, "Extracting %d messages from %s to %s/%s", dbx->message_count, dbx->filename, out_dir, eml_dir); eml_files = sys_glob(eml_dir, "*.eml", &num_eml_files); no_more_messages = (imessage == dbx->message_count); no_more_files = (ifile == num_eml_files); qsort(eml_files, num_eml_files, sizeof(char *), (dbx_cmpfunc_t) _str_cmp); if (!dbx->options->delete_deleted) { int rc = sys_mkdir(eml_dir, "deleted"); if (rc != 0) { perror("_extract (sys_mkdir)"); return; } } while (!no_more_messages || !no_more_files) { int cond; int ignore; ignore = (dbx->options->ignore0 && !no_more_messages && dbx->info[imessage].offset == 0); if (!no_more_messages && !no_more_files) { cond = strcmp(dbx->info[imessage].filename, eml_files[ifile]); if (ignore && cond == 0) { cond = 1; imessage++; } } else if (no_more_files) cond = -1; else cond = 1; if (!no_more_messages) dbx->info[imessage].extract = DBX_EXTRACT_IGNORE; if (cond < 0) { /* message not found on disk: extract from dbx */ if (!ignore) dbx->info[imessage].extract = DBX_EXTRACT_FORCE; imessage++; } else if (cond == 0) { /* message found on disk: extract from dbx if modified */ dbx->info[imessage].extract = DBX_EXTRACT_MAYBE; imessage++; ifile++; } else { /* file on disk not found in dbx: move it to 'deleted' sub-folder or delete from disk */ if (!dbx->options->delete_deleted) { int rc = sys_move(eml_dir, eml_files[ifile], "deleted"); if (rc != 0) perror("_extract (sys_move)"); dbx_progress_update(dbx->progress_handle, DBX_STATUS_MOVED, -1, "%s", eml_files[ifile]); } else { int rc = sys_delete(eml_dir, eml_files[ifile]); if (rc != 0) perror("_extract (sys_delete)"); dbx_progress_update(dbx->progress_handle, DBX_STATUS_DELETED, -1, "%s", eml_files[ifile]); } ifile++; (*deleted)++; } no_more_messages = (imessage == dbx->message_count); no_more_files = (ifile == num_eml_files); } /* sort entries by offset: should make extraction faster in most cases */ qsort(dbx->info, dbx->message_count, sizeof(dbx_info_t), (dbx_cmpfunc_t) _dbx_offset_cmp); for(imessage = 0; imessage < dbx->message_count; imessage++) { dbx_save_status_t status = DBX_SAVE_NOOP; switch (dbx->info[imessage].extract) { case DBX_EXTRACT_IGNORE: break; case DBX_EXTRACT_FORCE: status = _maybe_save_message(dbx, imessage, eml_dir, 1); break; case DBX_EXTRACT_MAYBE: status = _maybe_save_message(dbx, imessage, eml_dir, 0); break; } if (status == DBX_SAVE_OK) (*saved)++; if (status == DBX_SAVE_ERROR) (*errors)++; } dbx_progress_pop(dbx->progress_handle, "%d messages saved, %d skipped, %d errors, %d files %s", *saved, dbx->message_count - *saved - *errors, *errors, *deleted, !dbx->options->delete_deleted? "moved":"deleted"); sys_glob_free(eml_files); }