This is pop_uidl.c in view mode; [Download] [Up]
/* * Copyright (c) 1997 by Qualcomm Incorporated. */ #include <config.h> #include <stdio.h> #include <sys/types.h> #include <sys/file.h> #include <sys/wait.h> #include <ctype.h> #include <string.h> #ifndef HAVE_INDEX # define index(s,c) strchr(s,c) #endif #if HAVE_STRINGS_H #include <strings.h> #endif #include "popper.h" /* * uidl: POP UIDL function to list messages by message-ids */ pop_uidl (p) POP * p; { char buffer[MAXLINELEN]; /* Read buffer */ char *nl, *bp; MsgInfoList * mp; /* Pointer to message info list */ int msg_id = 0, x; int len = 0; if (p->parm_count == 1) { len = strlen(p->pop_parm[1]); /* Convert the parameter into an integer */ msg_id = atoi(p->pop_parm[1]); } /* Is requested message out of range? */ if (len > 0 && msg_id == 0) { return (pop_msg (p,POP_FAILURE,"Parameter must be a number (range 1 to %d)", p->msg_count)); } if (len > 0 && (msg_id < 1 || msg_id > p->msg_count)) return (pop_msg (p,POP_FAILURE, "Message out of range. %d messages in mail drop.",p->msg_count)); if (msg_id > 0) { /* Get a pointer to the message in the message list */ mp = &p->mlp[msg_id-1]; if (mp->del_flag) { return (pop_msg (p,POP_FAILURE, "Message %d has been marked for deletion.",msg_id)); } else { sprintf(buffer, "%d %s", msg_id, mp->uidl_str); if (nl = index(buffer, NEWLINE)) *nl = 0; return (pop_msg (p,POP_SUCCESS, buffer)); } } else { /* yes, we can do this */ pop_msg (p,POP_SUCCESS,"uidl command accepted."); for (x = 1; x <= p->msg_count; x++) { /* Get a pointer to the message in the message list */ mp = &p->mlp[x-1]; /* Is the message flagged for deletion? */ if (mp->del_flag) continue; sprintf(buffer, "%d %s", x, mp->uidl_str); /* nl = index(mp->uidl_str, NEWLINE); */ pop_sendline(p, buffer); /* if (!nl) fprintf(p->output, "\n"); */ } } /* "." signals the end of a multi-line transmission */ (void)fputs(".\r\n",p->output); (void)fflush(p->output); return(POP_SUCCESS); } /* * euidl: POP EUIDL function to list messages by message-ids and adds * message size and From: header text as well. This is to help * the Newton do some pre-filtering before downloading messages. */ char * from_hdr(p, mp) POP *p; MsgInfoList *mp; { char buf[MAXLINELEN], *cp; fseek(p->drop, mp->offset, 0); while (fgets(buf, sizeof(buf), p->drop) != NULL) { if (buf[0] == '\n') break; /* From header not found */ if (!strncasecmp("From:", buf, 5)) { cp = index(buf, ':'); while (*++cp && (*cp == ' ' || *cp == '\t')); return(cp); } } return(""); } pop_euidl (p) POP * p; { char buffer[MAXLINELEN]; /* Read buffer */ char *nl, *bp; MsgInfoList * mp; /* Pointer to message info list */ int msg_id = 0, x; int len = 0; if (p->parm_count == 1) { len = strlen(p->pop_parm[1]); /* Convert the parameter into an integer */ msg_id = atoi(p->pop_parm[1]); } /* Is requested message out of range? */ if (len > 0 && msg_id == 0) { return (pop_msg (p,POP_FAILURE,"Parameter must be a number (range 1 to %d)", p->msg_count)); } if (len > 0 && (msg_id < 1 || msg_id > p->msg_count)) return (pop_msg (p,POP_FAILURE, "Message out of range. %d messages in mail drop.",p->msg_count)); if (msg_id > 0) { /* Get a pointer to the message in the message list */ mp = &p->mlp[msg_id-1]; if (mp->del_flag) { return (pop_msg (p,POP_FAILURE, "Message %d has been marked for deletion.",msg_id)); } else { sprintf(buffer, "%d %s", msg_id, mp->uidl_str); if (nl = index(buffer, NEWLINE)) *nl = 0; sprintf(buffer, "%s %d %s", buffer, mp->length, from_hdr(p, mp)); return (pop_msg (p,POP_SUCCESS, buffer)); } } else { /* yes, we can do this */ pop_msg (p,POP_SUCCESS,"uidl command accepted."); for (x = 1; x <= p->msg_count; x++) { /* Get a pointer to the message in the message list */ mp = &p->mlp[x-1]; /* Is the message flagged for deletion? */ if (mp->del_flag) continue; sprintf(buffer, "%d %s", x, mp->uidl_str); if (nl = index(buffer, NEWLINE)) *nl = 0; sprintf(buffer, "%s %d %s", buffer, mp->length, from_hdr(p, mp)); pop_sendline(p, buffer); } } /* "." signals the end of a multi-line transmission */ (void)fputs(".\r\n",p->output); (void)fflush(p->output); return(POP_SUCCESS); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.