⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 attach.c

📁 mutt-1.5.12 源代码。linux 下邮件接受的工具。
💻 C
📖 第 1 页 / 共 2 页
字号:
	  close(tempfd);	mutt_error _("Cannot create filter");	goto return_error;      }      if (use_pager)      {	if (a->description)	  snprintf (descrip, sizeof (descrip),		    "---Command: %-20.20s Description: %s",		    command, a->description);	else	  snprintf (descrip, sizeof (descrip),		    "---Command: %-30.30s Attachment: %s", command, type);      }      if ((mutt_wait_filter (thepid) || (entry->needsterminal &&	  option (OPTWAITKEY))) && !use_pager)	mutt_any_key_to_continue (NULL);            close(tempfd);      close(pagerfd);          }    else    {      /* interactive command */      if (mutt_system (command) ||	  (entry->needsterminal && option (OPTWAITKEY)))	mutt_any_key_to_continue (NULL);    }  }  else  {    /* Don't use mailcap; the attachment is viewed in the pager */    if (flag == M_AS_TEXT)    {      /* just let me see the raw data */      if (mutt_save_attachment (fp, a, pagerfile, 0, NULL))	goto return_error;    }    else    {      /* Use built-in handler */      set_option (OPTVIEWATTACH); /* disable the "use 'v' to view this part"				   * message in case of error */      if (mutt_decode_save_attachment (fp, a, pagerfile, M_DISPLAY, 0))      {	unset_option (OPTVIEWATTACH);	goto return_error;      }      unset_option (OPTVIEWATTACH);    }        if (a->description)      strfcpy (descrip, a->description, sizeof (descrip));    else if (a->filename)      snprintf (descrip, sizeof (descrip), "---Attachment: %s : %s",	  a->filename, type);    else      snprintf (descrip, sizeof (descrip), "---Attachment: %s", type);  }    /* We only reach this point if there have been no errors */  if (use_pager)  {    pager_t info;        memset (&info, 0, sizeof (info));    info.fp = fp;    info.bdy = a;    info.ctx = Context;    info.idx = idx;    info.idxlen = idxlen;    info.hdr = hdr;    rc = mutt_do_pager (descrip, pagerfile,			M_PAGER_ATTACHMENT | (is_message ? M_PAGER_MESSAGE : 0), &info);    *pagerfile = '\0';  }  else    rc = 0;  return_error:    if (entry)    rfc1524_free_entry (&entry);  if (fp && tempfile[0])    mutt_unlink (tempfile);  else if (unlink_tempfile)    unlink(tempfile);  if (pagerfile[0])    mutt_unlink (pagerfile);  return rc;}/* returns 1 on success, 0 on error */int mutt_pipe_attachment (FILE *fp, BODY *b, const char *path, char *outfile){  pid_t thepid;  int out = -1;  int rv = 0;    if (outfile && *outfile)    if ((out = safe_open (outfile, O_CREAT | O_EXCL | O_WRONLY)) < 0)    {      mutt_perror ("open");      return 0;    }  mutt_endwin (NULL);  if (fp)  {    /* recv case */    STATE s;    memset (&s, 0, sizeof (STATE));    if (outfile && *outfile)      thepid = mutt_create_filter_fd (path, &s.fpout, NULL, NULL, -1, out, -1);    else      thepid = mutt_create_filter (path, &s.fpout, NULL, NULL);    if (thepid < 0)    {      mutt_perror _("Can't create filter");      goto bail;    }        s.fpin = fp;    mutt_decode_attachment (b, &s);    safe_fclose (&s.fpout);  }  else  {    /* send case */    FILE *ifp, *ofp;    if ((ifp = fopen (b->filename, "r")) == NULL)    {      mutt_perror ("fopen");      if (outfile && *outfile)      {	close (out);	unlink (outfile);      }      return 0;    }    if (outfile && *outfile)      thepid = mutt_create_filter_fd (path, &ofp, NULL, NULL, -1, out, -1);    else      thepid = mutt_create_filter (path, &ofp, NULL, NULL);    if (thepid < 0)    {      mutt_perror _("Can't create filter");      safe_fclose (&ifp);      goto bail;    }        mutt_copy_stream (ifp, ofp);    safe_fclose (&ofp);    safe_fclose (&ifp);  }  rv = 1;  bail:    if (outfile && *outfile)    close (out);  /*   * check for error exit from child process   */  if (mutt_wait_filter (thepid) != 0)    rv = 0;  if (rv == 0 || option (OPTWAITKEY))    mutt_any_key_to_continue (NULL);  return rv;}static FILE *mutt_save_attachment_open (char *path, int flags){  if (flags == M_SAVE_APPEND)    return fopen (path, "a");  if (flags == M_SAVE_OVERWRITE)    return fopen (path, "w");		/* __FOPEN_CHECKED__ */    return safe_fopen (path, "w");}/* returns 0 on success, -1 on error */int mutt_save_attachment (FILE *fp, BODY *m, char *path, int flags, HEADER *hdr){  if (fp)  {        /* recv mode */    if(hdr &&	m->hdr &&	m->encoding != ENCBASE64 &&	m->encoding != ENCQUOTEDPRINTABLE &&	mutt_is_message_type(m->type, m->subtype))    {      /* message type attachments are written to mail folders. */      char buf[HUGE_STRING];      HEADER *hn;      CONTEXT ctx;      MESSAGE *msg;      int chflags = 0;      int r = -1;            hn = m->hdr;      hn->msgno = hdr->msgno; /* required for MH/maildir */      hn->read = 1;      fseeko (fp, m->offset, 0);      if (fgets (buf, sizeof (buf), fp) == NULL)	return -1;      if (mx_open_mailbox(path, M_APPEND | M_QUIET, &ctx) == NULL)	return -1;      if ((msg = mx_open_new_message (&ctx, hn, is_from (buf, NULL, 0, NULL) ? 0 : M_ADD_FROM)) == NULL)      {	mx_close_mailbox(&ctx, NULL);	return -1;      }      if (ctx.magic == M_MBOX || ctx.magic == M_MMDF)	chflags = CH_FROM | CH_UPDATE_LEN;      chflags |= (ctx.magic == M_MAILDIR ? CH_NOSTATUS : CH_UPDATE);      if (_mutt_copy_message (msg->fp, fp, hn, hn->content, 0, chflags) == 0 	  && mx_commit_message (msg, &ctx) == 0)	r = 0;      else	r = -1;      mx_close_message (&msg);      mx_close_mailbox (&ctx, NULL);      return r;    }    else    {      /* In recv mode, extract from folder and decode */            STATE s;            memset (&s, 0, sizeof (s));      if ((s.fpout = mutt_save_attachment_open (path, flags)) == NULL)      {	mutt_perror ("fopen");	return (-1);      }      fseeko ((s.fpin = fp), m->offset, 0);      mutt_decode_attachment (m, &s);            if (fclose (s.fpout) != 0)      {	mutt_perror ("fclose");	return (-1);      }    }  }  else  {    /* In send mode, just copy file */    FILE *ofp, *nfp;    if ((ofp = fopen (m->filename, "r")) == NULL)    {      mutt_perror ("fopen");      return (-1);    }        if ((nfp = mutt_save_attachment_open (path, flags)) == NULL)    {      mutt_perror ("fopen");      safe_fclose (&ofp);      return (-1);    }    if (mutt_copy_stream (ofp, nfp) == -1)    {      mutt_error _("Write fault!");      safe_fclose (&ofp);      safe_fclose (&nfp);      return (-1);    }    safe_fclose (&ofp);    safe_fclose (&nfp);  }  return 0;}/* returns 0 on success, -1 on error */int mutt_decode_save_attachment (FILE *fp, BODY *m, char *path,				 int displaying, int flags){  STATE s;  unsigned int saved_encoding = 0;  BODY *saved_parts = NULL;  HEADER *saved_hdr = NULL;  memset (&s, 0, sizeof (s));  s.flags = displaying;  if (flags == M_SAVE_APPEND)    s.fpout = fopen (path, "a");  else if (flags == M_SAVE_OVERWRITE)    s.fpout = fopen (path, "w");	/* __FOPEN_CHECKED__ */  else    s.fpout = safe_fopen (path, "w");  if (s.fpout == NULL)  {    mutt_perror ("fopen");    return (-1);  }  if (fp == NULL)  {    /* When called from the compose menu, the attachment isn't parsed,     * so we need to do it here. */    struct stat st;    if (stat (m->filename, &st) == -1)    {      mutt_perror ("stat");      fclose (s.fpout);      return (-1);    }    if ((s.fpin = fopen (m->filename, "r")) == NULL)    {      mutt_perror ("fopen");      return (-1);    }    saved_encoding = m->encoding;    if (!is_multipart (m))      m->encoding = ENC8BIT;        m->length = st.st_size;    m->offset = 0;    saved_parts = m->parts;    saved_hdr = m->hdr;    mutt_parse_part (s.fpin, m);    if (m->noconv || is_multipart (m))      s.flags |= M_CHARCONV;  }  else  {    s.fpin = fp;    s.flags |= M_CHARCONV;  }  mutt_body_handler (m, &s);  fclose (s.fpout);  if (fp == NULL)  {    m->length = 0;    m->encoding = saved_encoding;    if (saved_parts)    {      mutt_free_header (&m->hdr);      m->parts = saved_parts;      m->hdr = saved_hdr;    }    fclose (s.fpin);  }  return (0);}/* Ok, the difference between send and receive: * recv: BODY->filename is a suggested name, and Context|HEADER points *       to the attachment in mailbox which is encooded * send: BODY->filename points to the un-encoded file which contains the  *       attachment */int mutt_print_attachment (FILE *fp, BODY *a){  char newfile[_POSIX_PATH_MAX] = "";  char type[STRING];  pid_t thepid;  FILE *ifp, *fpout;  short unlink_newfile = 0;    snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype);  if (rfc1524_mailcap_lookup (a, type, NULL, M_PRINT))   {    char command[_POSIX_PATH_MAX+STRING];    rfc1524_entry *entry;    int piped = FALSE;    dprint (2, (debugfile, "Using mailcap...\n"));        entry = rfc1524_new_entry ();    rfc1524_mailcap_lookup (a, type, entry, M_PRINT);    if (rfc1524_expand_filename (entry->nametemplate, a->filename,						  newfile, sizeof (newfile)))    {      if (!fp)      {	if (safe_symlink(a->filename, newfile) == -1)	{	  if (mutt_yesorno (_("Can't match nametemplate, continue?"), M_YES) != M_YES)	  {	    rfc1524_free_entry (&entry);	    return 0;	  }	  strfcpy (newfile, a->filename, sizeof (newfile));	}	else	  unlink_newfile = 1;      }    }    /* in recv mode, save file to newfile first */    if (fp)      mutt_save_attachment (fp, a, newfile, 0, NULL);    strfcpy (command, entry->printcommand, sizeof (command));    piped = rfc1524_expand_command (a, newfile, type, command, sizeof (command));    mutt_endwin (NULL);    /* interactive program */    if (piped)    {      if ((ifp = fopen (newfile, "r")) == NULL)      {	mutt_perror ("fopen");	rfc1524_free_entry (&entry);	return (0);      }      if ((thepid = mutt_create_filter (command, &fpout, NULL, NULL)) < 0)      {	mutt_perror _("Can't create filter");	rfc1524_free_entry (&entry);	safe_fclose (&ifp);	return 0;      }      mutt_copy_stream (ifp, fpout);      safe_fclose (&fpout);      safe_fclose (&ifp);      if (mutt_wait_filter (thepid) || option (OPTWAITKEY))	mutt_any_key_to_continue (NULL);    }    else    {      if (mutt_system (command) || option (OPTWAITKEY))	mutt_any_key_to_continue (NULL);    }    if (fp)      mutt_unlink (newfile);    else if (unlink_newfile)      unlink(newfile);    rfc1524_free_entry (&entry);    return (1);  }  if (!ascii_strcasecmp ("text/plain", type) ||      !ascii_strcasecmp ("application/postscript", type))  {    return (mutt_pipe_attachment (fp, a, NONULL(PrintCmd), NULL));  }  else if (mutt_can_decode (a))  {    /* decode and print */    int rc = 0;        ifp = NULL;    fpout = NULL;        mutt_mktemp (newfile);    if (mutt_decode_save_attachment (fp, a, newfile, M_PRINTING, 0) == 0)    {            dprint (2, (debugfile, "successfully decoded %s type attachment to %s\n",		  type, newfile));            if ((ifp = fopen (newfile, "r")) == NULL)      {	mutt_perror ("fopen");	goto bail0;      }      dprint (2, (debugfile, "successfully opened %s read-only\n", newfile));            mutt_endwin (NULL);      if ((thepid = mutt_create_filter (NONULL(PrintCmd), &fpout, NULL, NULL)) < 0)      {	mutt_perror _("Can't create filter");	goto bail0;      }      dprint (2, (debugfile, "Filter created.\n"));            mutt_copy_stream (ifp, fpout);      safe_fclose (&fpout);      safe_fclose (&ifp);      if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY))	mutt_any_key_to_continue (NULL);      rc = 1;    }  bail0:    safe_fclose (&ifp);    safe_fclose (&fpout);    mutt_unlink (newfile);    return rc;  }  else  {    mutt_error _("I don't know how to print that!");    return 0;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -