Blame view

imap4d/append.c 3.51 KB
Jakob Kaivo authored
1
/* GNU mailutils - a suite of utilities for electronic mail
2
   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
Jakob Kaivo authored
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */

#include "imap4d.h"

20
/* APPEND mbox [(flags)] [date_time] message_literal */
Jakob Kaivo authored
21
int
22
imap4d_append (struct imap4d_command *command, char *arg)
Jakob Kaivo authored
23
{
24 25 26 27 28 29
  char *sp;
  char *mboxname;
  int flags = 0;
  mailbox_t dest_mbox = NULL;
  int status;
  
30 31
  if (! (command->states & state))
    return util_finish (command, RESP_BAD, "Wrong state");
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

  mboxname = util_getword (arg, &sp);
  if (!mboxname)
    return util_finish (command, RESP_BAD, "Too few arguments");

  if (*sp == '(' && util_parse_attributes (sp+1, &sp, &flags))
    return util_finish (command, RESP_BAD, "Missing closing parenthesis");

  mboxname = namespace_getfullpath (mboxname, "/");
  if (!mboxname)
    return util_finish (command, RESP_NO, "Couldn't open mailbox"); 

  status = mailbox_create_default (&dest_mbox, mboxname);
  if (status == 0)
    {
      /* It SHOULD NOT automatifcllly create the mailbox. */
      status = mailbox_open (dest_mbox, MU_STREAM_RDWR);
      if (status == 0)
	{
	  status = imap4d_append0 (dest_mbox, flags, sp);
	  mailbox_close (dest_mbox);
	}
      mailbox_destroy (&dest_mbox);
    }
  
  free (mboxname);
  if (status == 0)
    return util_finish (command, RESP_OK, "Completed");

  return util_finish (command, RESP_NO, "[TRYCREATE] failed");
Jakob Kaivo authored
62
}
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

int
imap4d_append0 (mailbox_t mbox, int flags, char *text)
{
  mailbox_t tmp;
  stream_t stream;
  int rc = 0;
  size_t len = 0;
  message_t msg;
  struct tm *tm;
  time_t t;
  char date[80];
  
  if (mailbox_create (&tmp, "/dev/null"))
    return 1;
  if (mailbox_open (tmp, MU_STREAM_READ) != 0)
    return 1;
  
81 82
  if (memory_stream_create (&stream, 0, MU_STREAM_RDWR)
      || stream_open (stream))
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
    {
      mailbox_close (tmp);
      return 1;
    }

  /* If a date_time is specified, the internal date SHOULD be set in the
     resulting message; otherwise, the internal date of the resulting
     message is set to the current date and time by default. */
  if (util_parse_internal_date0 (text, &t, &text) == 0)
    {
      while (*text && isspace(*text))
	text++;
    }
  else
    {
      time(&t);
    }
  tm = gmtime(&t);
  strftime (date, sizeof (date),
	    "From GNU-imap4d %a %b %e %H:%M:%S %Y%n",
	    tm);
  
  stream_write (stream, date, strlen (date), 0, &len);
  stream_write (stream, text, strlen (text), len, &len);

  mailbox_set_stream (tmp, stream);
  mailbox_messages_count (tmp, &len);
  if (len == 1)
    {
      mailbox_get_message (tmp, 1, &msg);
      mailbox_append_message (mbox, msg);
      if (flags)
	{
	  size_t num = 0;
	  attribute_t attr = NULL;
	  mailbox_messages_count (mbox, &num);
	  mailbox_get_message (mbox, num, &msg);
	  message_get_attribute (msg, &attr);
	  attribute_set_flags (attr, flags);
	}
    }
  else
    rc = 1;
  
  mailbox_close (tmp);
  mailbox_destroy (&tmp);
  return rc;
}