Ejemplo n.º 1
0
int mailmh_folder_move_message(struct mailmh_folder * dest_folder,
			       struct mailmh_folder * src_folder,
			       uint32_t indx)
{
  int fd;
  char * filename;
  int r;

  /* move on the same filesystem */
  r = mailmh_folder_get_message_filename(src_folder, indx, &filename);
  if (r != MAILMH_NO_ERROR)
    return r;

  r = mailmh_folder_alloc_msg(dest_folder, filename, &indx);
  free(filename);
  if (r == MAILMH_NO_ERROR)
    return MAILMH_NO_ERROR;

  /* move on the different filesystems */
  r = mailmh_folder_get_message_fd(src_folder, indx, O_RDONLY, &fd);
  if (r != MAILMH_NO_ERROR)
    return r;

  r = mailmh_folder_add_message_file(dest_folder, fd);
  if (r != MAILMH_NO_ERROR) {
    close(fd);
    return r;
  }

  close(fd);

  r = mailmh_folder_remove_message(src_folder, indx);

  return MAILMH_NO_ERROR;
}
Ejemplo n.º 2
0
static int mhdriver_copy_message(mailsession * session,
				 uint32_t num, const char * mb)
{
  int fd;
  int r;
  struct mailmh_folder * folder;
  struct mailmh * mh;
  int res;

  mh = get_mh_session(session);
  if (mh == NULL) {
    res = MAIL_ERROR_BAD_STATE;
    goto err;
  }

  folder = get_mh_cur_folder(session);
  if (folder == NULL) {
    res = MAIL_ERROR_BAD_STATE;
    goto err;
  }

  r = mailmh_folder_get_message_fd(folder, num, O_RDONLY, &fd);
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto err;
  }

  folder = mailmh_folder_find(mh->mh_main, mb);
  if (folder == NULL) {
    res = MAIL_ERROR_FOLDER_NOT_FOUND;
    goto close;
  }

  r = mailmh_folder_add_message_file(folder, fd);
  if (r != MAIL_NO_ERROR) {
    res = MAIL_ERROR_COPY;
    goto close;
  }

  close(fd);

  return MAIL_NO_ERROR;
  
 close:
  close(fd);
 err:
  return res;
}