Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
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);
}