2 * Copyright (c) 1989 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
10 #if defined(UIDL) || defined(XOVER)
13 * Copy the string found after after : into a malloced buffer. Stop
14 * copying at end of string or end of line. End of line delimiter is
15 * not part of the resulting copy.
19 find_value_after_colon(char *p
)
23 for (; *p
!= 0 && *p
!= ':'; p
++) /* Find : */
29 p
++; /* Skip over : */
31 for(; *p
== ' ' || *p
== '\t'; p
++) /* Remove white space */
34 for (t
= p
; *t
!= 0 && *t
!= '\n' && *t
!= '\r'; t
++) /* Find end of str */
37 tmp
= t
= malloc(t
- p
+ 1);
41 for (; *p
!= 0 && *p
!= '\n' && *p
!= '\r'; p
++, t
++) /* Copy characters */
43 *t
= 0; /* Terminate string */
52 parse_header(MsgInfoList
*mp
, char *buffer
)
54 #if defined(UIDL) || defined(XOVER)
55 if (strncasecmp("Message-Id:",buffer
, 11) == 0) {
56 if (mp
->msg_id
== NULL
)
57 mp
->msg_id
= find_value_after_colon(buffer
);
60 else if (strncasecmp(buffer
, "X-UIDL:", 7) == 0) {
61 /* Courtesy to Qualcomm, there really is no such
63 mp
->msg_id
= find_value_after_colon(buffer
);
68 else if (strncasecmp("Subject:", buffer
, 8) == 0) {
69 if(mp
->subject
== NULL
){
71 mp
->subject
= find_value_after_colon(buffer
);
72 for(p
= mp
->subject
; *p
; p
++)
73 if(*p
== '\t') *p
= ' ';
76 else if (strncasecmp("From:", buffer
, 5) == 0) {
79 mp
->from
= find_value_after_colon(buffer
);
80 for(p
= mp
->from
; *p
; p
++)
81 if(*p
== '\t') *p
= ' ';
84 else if (strncasecmp("Date:", buffer
, 5) == 0) {
87 mp
->date
= find_value_after_colon(buffer
);
88 for(p
= mp
->date
; *p
; p
++)
89 if(*p
== '\t') *p
= ' ';
96 add_missing_headers(POP
*p
, MsgInfoList
*mp
)
98 #if defined(UIDL) || defined(XOVER)
99 if (mp
->msg_id
== NULL
) {
100 asprintf(&mp
->msg_id
, "no-message-id-%d", mp
->number
);
101 if(mp
->msg_id
== NULL
) {
104 return pop_msg (p
,POP_FAILURE
,
105 "Can't build message list for '%s': Out of memory",
111 if (mp
->subject
== NULL
)
112 mp
->subject
= "<none>";
113 if (mp
->from
== NULL
)
114 mp
->from
= "<unknown>";
115 if (mp
->date
== NULL
)
116 mp
->date
= "<unknown>";
122 * dropinfo: Extract information about the POP maildrop and store
123 * it for use by the other POP routines.
129 char buffer
[BUFSIZ
]; /* Read buffer */
130 MsgInfoList
* mp
; /* Pointer to message
132 int msg_num
; /* Current message
134 int nchar
; /* Bytes written/read */
135 int blank_line
= 1; /* previous line was blank */
136 int in_header
= 0; /* if we are in a header block */
138 /* Initialize maildrop status variables in the POP parameter block */
142 p
->bytes_deleted
= 0;
145 /* Allocate memory for message information structures */
146 p
->msg_count
= ALLOC_MSGS
;
147 p
->mlp
= (MsgInfoList
*)calloc((unsigned)p
->msg_count
,sizeof(MsgInfoList
));
151 return pop_msg (p
,POP_FAILURE
,
152 "Can't build message list for '%s': Out of memory", p
->user
);
157 /* Scan the file, loading the message information list with
158 information about each message */
160 for (msg_num
= p
->drop_size
= 0, mp
= p
->mlp
- 1;
161 fgets(buffer
,MAXMSGLINELEN
,p
->drop
);) {
163 nchar
= strlen(buffer
);
165 if (blank_line
&& strncmp(buffer
,"From ",5) == 0) {
167 if (++msg_num
> p
->msg_count
) {
168 p
->mlp
=(MsgInfoList
*) realloc(p
->mlp
,
169 (p
->msg_count
+=ALLOC_MSGS
)*sizeof(MsgInfoList
));
173 return pop_msg (p
,POP_FAILURE
,
174 "Can't build message list for '%s': Out of memory",
177 mp
= p
->mlp
+ msg_num
- 2;
180 mp
->number
= msg_num
;
183 mp
->offset
= ftell(p
->drop
) - nchar
;
185 #if defined(UIDL) || defined(XOVER)
195 pop_log(p
, POP_DEBUG
,
196 "Msg %d at offset %ld being added to list",
197 mp
->number
, mp
->offset
);
200 parse_header(mp
, buffer
);
201 blank_line
= (strncmp(buffer
, "\n", nchar
) == 0);
205 e
= add_missing_headers(p
, mp
);
210 p
->drop_size
+= nchar
;
213 p
->msg_count
= msg_num
;
216 if(p
->debug
&& msg_num
> 0) {
218 for (i
= 0, mp
= p
->mlp
; i
< p
->msg_count
; i
++, mp
++)
221 "Msg %d at offset %ld is %ld octets long and has %u lines and id %s.",
222 mp
->number
,mp
->offset
,mp
->length
,mp
->lines
, mp
->msg_id
);
225 "Msg %d at offset %d is %d octets long and has %u lines.",
226 mp
->number
,mp
->offset
,mp
->length
,mp
->lines
);