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 if (asprintf(&mp
->msg_id
, "no-message-id-%d", mp
->number
) == -1) {
103 return pop_msg (p
,POP_FAILURE
,
104 "Can't build message list for '%s': Out of memory",
110 if (mp
->subject
== NULL
)
111 mp
->subject
= "<none>";
112 if (mp
->from
== NULL
)
113 mp
->from
= "<unknown>";
114 if (mp
->date
== NULL
)
115 mp
->date
= "<unknown>";
121 * dropinfo: Extract information about the POP maildrop and store
122 * it for use by the other POP routines.
128 char buffer
[BUFSIZ
]; /* Read buffer */
129 MsgInfoList
* mp
; /* Pointer to message
131 int msg_num
; /* Current message
133 int nchar
; /* Bytes written/read */
134 int blank_line
= 1; /* previous line was blank */
135 int in_header
= 0; /* if we are in a header block */
137 /* Initialize maildrop status variables in the POP parameter block */
141 p
->bytes_deleted
= 0;
144 /* Allocate memory for message information structures */
145 p
->msg_count
= ALLOC_MSGS
;
146 p
->mlp
= (MsgInfoList
*)calloc((unsigned)p
->msg_count
,sizeof(MsgInfoList
));
150 return pop_msg (p
,POP_FAILURE
,
151 "Can't build message list for '%s': Out of memory", p
->user
);
156 /* Scan the file, loading the message information list with
157 information about each message */
159 for (msg_num
= p
->drop_size
= 0, mp
= p
->mlp
- 1;
160 fgets(buffer
,MAXMSGLINELEN
,p
->drop
);) {
162 nchar
= strlen(buffer
);
164 if (blank_line
&& strncmp(buffer
,"From ",5) == 0) {
166 if (++msg_num
> p
->msg_count
) {
167 p
->mlp
=(MsgInfoList
*) realloc(p
->mlp
,
168 (p
->msg_count
+=ALLOC_MSGS
)*sizeof(MsgInfoList
));
172 return pop_msg (p
,POP_FAILURE
,
173 "Can't build message list for '%s': Out of memory",
176 mp
= p
->mlp
+ msg_num
- 2;
179 mp
->number
= msg_num
;
182 mp
->offset
= ftell(p
->drop
) - nchar
;
184 #if defined(UIDL) || defined(XOVER)
194 pop_log(p
, POP_DEBUG
,
195 "Msg %d at offset %ld being added to list",
196 mp
->number
, mp
->offset
);
199 parse_header(mp
, buffer
);
200 blank_line
= (strncmp(buffer
, "\n", nchar
) == 0);
204 e
= add_missing_headers(p
, mp
);
209 p
->drop_size
+= nchar
;
212 p
->msg_count
= msg_num
;
215 if(p
->debug
&& msg_num
> 0) {
217 for (i
= 0, mp
= p
->mlp
; i
< p
->msg_count
; i
++, mp
++)
220 "Msg %d at offset %ld is %ld octets long and has %u lines and id %s.",
221 mp
->number
,mp
->offset
,mp
->length
,mp
->lines
, mp
->msg_id
);
224 "Msg %d at offset %d is %d octets long and has %u lines.",
225 mp
->number
,mp
->offset
,mp
->length
,mp
->lines
);