This is pop_uidl.c in view mode; [Download] [Up]
#include <stdio.h> #include <sys/types.h> #include <sys/file.h> #include <sys/wait.h> #include <ctype.h> #include "popper.h" #if defined(SOLARIS2) || defined(SYSV) || defined(AIX) #include <string.h> #define index(s,c) strchr(s,c) #else #include <strings.h> #endif /* * 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 { /* Position to the start of the message */ (void)fseek(p->drop,mp->offset,0); /* Skip the first line (the sendmail "From" line) */ (void)fgets (buffer,MAXMSGLINELEN,p->drop); /* scan until we fine the header or a blank line */ while (fgets(buffer,MAXMSGLINELEN,p->drop)) { if (*buffer=='\n') break; if (!strncasecmp(buffer,MSGUIDL,strlen(MSGUIDL))) { /* found it! */ bp = buffer; while (*bp && ! isspace(*bp)) bp++; while (*bp && isspace(*bp)) bp++; if (nl = index(buffer,NEWLINE)) *nl = 0; return (pop_msg (p,POP_SUCCESS, "%d %s", msg_id, bp)); } } return (pop_msg (p,POP_FAILURE,"Message-Id Header not found.")); } } 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; /* Position to the start of the message */ (void)fseek(p->drop,mp->offset,0); /* Skip the first line (the sendmail "From" line) */ (void)fgets (buffer,MAXMSGLINELEN,p->drop); /* scan until we fine the header or a blank line */ while (fgets(buffer,MAXMSGLINELEN,p->drop)) { if (*buffer=='\n') break; if (!strncasecmp(buffer,MSGUIDL,strlen(MSGUIDL))) { /* found it! */ fprintf(p->output,"%d ",x); bp = buffer; while (*bp && ! isspace(*bp)) bp++; while (*bp && isspace(*bp)) bp++; pop_sendline (p,bp); while (fgets(buffer,MAXMSGLINELEN,p->drop)) { if (*buffer!=' ' && *buffer!='\t') break; pop_sendline(p,buffer); } break; } } } } /* "." 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.