int main (int argc, char **argv) { char *delim = ""; char *comment = "#"; char buf[512]; while (fgets (buf, sizeof buf, stdin)) { int status, c; char **v; char *s; status = mu_argcv_get (buf, delim, comment, &c, &v); if (status) { fprintf (stderr, "cannot parse: %s\n", mu_strerror (status)); continue; } status = mu_argcv_string (c, v, &s); if (status) fprintf (stderr, "cannot create string: %s\n", mu_strerror (status)); else { printf ("%d: %s\n", c, s); free (s); } mu_argcv_free (c, v); } exit (0); }
static int _whatnow (struct mh_whatnow_env *wh, struct action_tab *tab) { int rc, status = 0; do { char *line = NULL; size_t size = 0; int argc; char **argv; handler_fp fun; printf ("%s ", wh->prompt); getline (&line, &size, stdin); if (!line) continue; rc = mu_argcv_get (line, "", "#", &argc, &argv); free (line); if (rc) { mu_argcv_free (argc, argv); break; } fun = func (tab, argv[0]); if (fun) rc = fun (wh, argc, argv, &status); else rc = 0; mu_argcv_free (argc, argv); } while (rc == 0); return status; }
int main (int argc, char **argv) { int c; char buf[512]; char **prevv; int prevc = 0; interactive = isatty (0); while ((c = getopt (argc, argv, "f:h")) != EOF) { switch (c) { case 'f': file = optarg; break; case 'h': printf ("usage: header [-f file]\n"); exit (0); default: exit (1); } } if (file) { if (load_file (file)) exit (1); } else { int status = mu_header_create (&header, NULL, 0, NULL); if (status) { mu_error ("cannot create header: %s", mu_strerror (status)); exit (1); } } while (prompt(0), fgets(buf, sizeof buf, stdin)) { int c; char **v; int status; line_num++; status = mu_argcv_get (buf, NULL, "#", &c, &v); if (status) { mu_error ("%u: cannot parse: %s", line_num, mu_strerror (status)); continue; } if (c == 0) { if (prevc) docmd (prevc, prevv); else mu_argcv_free (c, v); } else { docmd (c, v); mu_argcv_free (prevc, prevv); prevc = c; prevv = v; } } exit (0); }
/* Treat arg as a name of user-defined sequence and attempt to expand it. Return 0 if succeeded, non-zero otherwise. */ int expand_user_seq (mu_mailbox_t mbox, mh_msgset_t *msgset, char *arg) { int argc; char **argv; char *p; const char *listp; int rc = 1; int negate = 0; p = strchr (arg, ':'); if (p) *p++ = 0; listp = mh_global_sequences_get (arg, NULL); if (!listp) { int len; const char *neg = mh_global_profile_get ("Sequence-Negation", NULL); if (!neg) return 1; len = strlen (neg); if (strncmp (arg, neg, len)) return 1; negate = 1; listp = mh_global_sequences_get (arg + len, NULL); if (!listp) return 1; } if (mu_argcv_get (listp, "", NULL, &argc, &argv) == 0) rc = _mh_msgset_parse (mbox, msgset, argc, argv); mu_argcv_free (argc, argv); if (rc) return rc; if (negate) mh_msgset_negate (mbox, msgset); if (p) { int first, num; num = strtoul (p, &p, 0); if (*p) { mh_msgset_free (msgset); return 1; } if (num < 0) { first = num + msgset->count; num = - num; } else first = 0; if (num > msgset->count) { mh_msgset_free (msgset); return 1; } if (first > 0) memmove (msgset->list, &msgset->list[first], sizeof (msgset->list[0]) * num); msgset->count = num; } return rc; }
void smtp (int fd) { int state, c; char *buf = NULL; size_t size = 0; mu_mailbox_t mbox; mu_message_t msg; char *tempfile; char *rcpt_addr; in = fdopen (fd, "r"); out = fdopen (fd, "w"); SETVBUF (in, NULL, _IOLBF, 0); SETVBUF (out, NULL, _IOLBF, 0); smtp_reply (220, "Ready"); for (state = STATE_INIT; state != STATE_QUIT; ) { int argc; char **argv; int kw, len; if (getline (&buf, &size, in) == -1) exit (1); len = strlen (buf); while (len > 0 && (buf[len-1] == '\n' || buf[len-1] == '\r')) len --; buf[len] = 0; if (mu_argcv_get (buf, "", NULL, &argc, &argv)) exit (1); kw = smtp_kw (argv[0]); if (kw == KW_QUIT) { smtp_reply (221, "Done"); state = STATE_QUIT; mu_argcv_free (argc, argv); continue; } switch (state) { case STATE_INIT: switch (kw) { case KW_EHLO: case KW_HELO: if (argc == 2) { smtp_reply (250, "pleased to meet you"); state = STATE_EHLO; } else smtp_reply (501, "%s requires domain address", argv[0]); break; default: smtp_reply (503, "Polite people say HELO first"); break; } break; case STATE_EHLO: switch (kw) { case KW_MAIL: if (argc == 2) from_person = check_prefix (argv[1], "from:"); else if (argc == 3 && mu_c_strcasecmp (argv[1], "from:") == 0) from_person = argv[2]; else from_person = NULL; if (from_person) { from_person = strdup (from_person); smtp_reply (250, "Sender OK"); state = STATE_MAIL; } else smtp_reply (501, "Syntax error"); break; default: smtp_reply (503, "Need MAIL command"); } break; case STATE_MAIL: switch (kw) { case KW_RCPT: if (argc == 2) rcpt_addr = check_prefix (argv[1], "to:"); else if (argc == 3 && mu_c_strcasecmp (argv[1], "to:") == 0) rcpt_addr = argv[2]; else rcpt_addr = NULL; if (rcpt_addr) { if (add_recipient (rcpt_addr)) smtp_reply (451, "Recipient not accepted"); else { smtp_reply (250, "Recipient OK"); state = STATE_RCPT; } } else smtp_reply (501, "Syntax error"); break; default: smtp_reply (503, "Need RCPT command"); } break; case STATE_RCPT: switch (kw) { case KW_RCPT: if (argc == 2) rcpt_addr = check_prefix (argv[1], "to:"); else if (argc == 3 && mu_c_strcasecmp (argv[1], "to:") == 0) rcpt_addr = argv[2]; else rcpt_addr = NULL; if (rcpt_addr) { if (add_recipient (rcpt_addr)) smtp_reply (451, "Recipient not accepted"); else { smtp_reply (250, "Recipient OK"); state = STATE_RCPT; } } else smtp_reply (501, "Syntax error"); break; case KW_DATA: smtp_reply (354, "Enter mail, end with \".\" on a line by itself"); make_tmp (in, from_person, &tempfile); if ((c = mu_mailbox_create_default (&mbox, tempfile)) != 0) { mu_error ("%s: can't create mailbox %s: %s", progname, tempfile, mu_strerror (c)); unlink (tempfile); exit (1); } if ((c = mu_mailbox_open (mbox, MU_STREAM_RDWR)) != 0) { mu_error ("%s: can't open mailbox %s: %s", progname, tempfile, mu_strerror (c)); unlink (tempfile); exit (1); } mu_mailbox_get_message (mbox, 1, &msg); if (message_finalize (msg, 0) == 0) mta_send (msg); else smtp_reply (501, "can't send message"); /*FIXME: code?*/ unlink (tempfile); mu_address_destroy (&recipients); from_person = NULL; smtp_reply (250, "Message accepted for delivery"); state = STATE_EHLO; break; default: smtp_reply (503, "Invalid command"); break; } break; } mu_argcv_free (argc, argv); } close (fd); }