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.
6 * static char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";
7 * static char SccsId[] = "@(#)@(#)popper.h 2.2 2.2 4/2/91";
11 /* $Id: popper.h,v 1.51 2002/07/04 13:56:12 joda Exp $ */
14 * Header file for the POP programs
23 #define RETURN_PATH_HANDLING
26 /* Common include files */
42 #ifdef HAVE_SYS_TYPES_H
43 #include <sys/types.h>
51 #ifdef HAVE_SYS_STAT_H
54 #ifdef HAVE_SYS_FILE_H
57 #ifdef TIME_WITH_SYS_TIME
60 #elif defined(HAVE_SYS_TIME_H)
65 #ifdef HAVE_SYS_RESOURCE_H
66 #include <sys/resource.h>
68 #ifdef HAVE_SYS_WAIT_H
71 #ifdef HAVE_SYS_SOCKET_H
72 #include <sys/socket.h>
74 #ifdef HAVE_NETINET_IN_H
75 #include <netinet/in.h>
77 #ifdef HAVE_NETINET_IN6_H
78 #include <netinet/in6.h>
80 #ifdef HAVE_NETINET6_IN6_H
81 #include <netinet6/in6.h>
87 #ifdef HAVE_ARPA_INET_H
89 struct sockaddr_dl; /* AIX fun */
92 #include <arpa/inet.h>
97 #ifdef HAVE_SYS_SELECT_H
98 #include <sys/select.h>
100 #ifdef HAVE_SYS_PARAM_H
101 #include <sys/param.h>
121 #define MAXUSERNAMELEN 65
122 #define MAXLINELEN 1024
123 #define MAXMSGLINELEN 1024
125 #define MAXPARMCOUNT 10
126 #define MAXPARMLEN 10
127 #define ALLOC_MSGS 20
128 #define MAIL_COMMAND "/usr/lib/sendmail"
130 #define POP_FACILITY LOG_LOCAL0
131 #define POP_PRIORITY LOG_NOTICE
132 #define POP_DEBUG LOG_DEBUG
133 #define POP_INFO LOG_INFO
134 #define POP_LOGOPTS 0
139 #ifdef HAVE_MAILLOCK_H
140 #include <maillock.h>
147 #if defined(KRB4_MAILDIR)
148 #define POP_MAILDIR KRB4_MAILDIR
149 #elif defined(_PATH_MAILDIR)
150 #define POP_MAILDIR _PATH_MAILDIR
151 #elif defined(MAILDIR)
152 #define POP_MAILDIR MAILDIR
154 #define POP_MAILDIR "/usr/spool/mail"
157 #define POP_DROP POP_MAILDIR "/.%s.pop"
158 /* POP_TMPSIZE needs to be big enough to hold the string
159 * defined by POP_TMPDROP. POP_DROP and POP_TMPDROP
160 * must be in the same filesystem.
162 #define POP_TMPDROP POP_MAILDIR "/tmpXXXXXX"
163 #define POP_TMPSIZE 256
164 #define POP_TMPXMIT "/tmp/xmitXXXXXX"
166 #define POP_ERR "-ERR"
167 #define POP_SUCCESS 1
168 #define POP_FAILURE 0
169 #define POP_TERMINATE '.'
170 #define POP_TIMEOUT 120 /* timeout connection after this many secs */
172 extern int pop_timeout;
179 #define pop_command pop_parm[0] /* POP command is first token */
180 #define pop_subcommand pop_parm[1] /* POP XTND subcommand is the
183 typedef enum { /* POP processing states */
184 auth1, /* Authorization: waiting for
186 auth2, /* Authorization: waiting for
188 trans, /* Transaction */
189 update, /* Update: session ended,
190 process maildrop changes */
191 halt, /* (Halt): stop processing
193 error /* (Error): something really
202 typedef struct { /* Message information */
203 int number; /* Message number relative to
204 the beginning of list */
205 long length; /* Length of message in
207 int lines; /* Number of (null-terminated) lines in the message */
208 long offset; /* Offset from beginning of
212 #if defined(UIDL) || defined(XOVER)
213 char *msg_id; /* The POP UIDL uniqueifier */
223 #define IS_MAILDIR(P) ((P)->temp_drop[0] == '\0')
225 typedef struct { /* POP parameter block */
226 int debug; /* Debugging requested */
227 char * myname; /* The name of this POP
229 char myhost[MaxHostNameLen]; /* The name of our host
231 char client[MaxHostNameLen]; /* Canonical name of client
233 char ipaddr[MaxHostNameLen]; /* Dotted-notation format of
235 unsigned short ipport; /* Client port for privileged
237 char user[MAXUSERNAMELEN]; /* Name of the POP user */
238 state CurrentState; /* The current POP operational state */
239 MsgInfoList * mlp; /* Message information list */
240 int msg_count; /* Number of messages in
242 int msgs_deleted; /* Number of messages flagged
244 int last_msg; /* Last message touched by
246 long bytes_deleted; /* Number of maildrop bytes
247 flagged for deletion */
248 char drop_name[MAXPATHLEN]; /* The name of the user's
250 char temp_drop[MAXPATHLEN]; /* The name of the user's
251 temporary maildrop */
252 long drop_size; /* Size of the maildrop in
254 FILE * drop; /* (Temporary) mail drop */
255 FILE * input; /* Input TCP/IP communication
257 FILE * output; /* Output TCP/IP communication stream */
258 FILE * trace; /* Debugging trace file */
259 char * pop_parm[MAXPARMCOUNT]; /* Parse POP parameter list */
260 int parm_count; /* Number of parameters in
262 int kerberosp; /* Using KPOP? */
267 krb5_context context;
268 krb5_principal principal; /* principal auth as */
269 krb5_log_facility* logf;
271 int version; /* 4 or 5? */
272 int auth_level; /* Dont allow cleartext */
274 OtpContext otp_ctx; /* OTP context */
277 #define POP_FLAG_CAPA 1
280 typedef struct { /* State information for
282 state ValidCurrentState; /* The operating state of
284 char * command; /* The POP command */
285 int min_parms; /* Minimum number of parms
287 int max_parms; /* Maximum number of parms
289 int (*function) (); /* The function that process
291 state result[2]; /* The resulting state after
292 command processing */
293 #define success_state result[0] /* State when a command
297 typedef struct { /* Table of extensions */
298 char * subcommand; /* The POP XTND subcommand */
299 int min_parms; /* Minimum number of parms for
301 int max_parms; /* Maximum number of parms for
303 int (*function) (); /* The function that processes
307 int pop_dele(POP *p);
308 int pop_dropcopy(POP *p, struct passwd *pwp);
309 int pop_dropinfo(POP *p);
310 int pop_init(POP *p,int argcount,char **argmessage);
311 int pop_last(POP *p);
312 int pop_list(POP *p);
313 int pop_parse(POP *p, char *buf);
314 int pop_pass(POP *p);
315 int pop_quit(POP *p);
316 int pop_rset(POP *p);
317 int pop_send(POP *p);
318 int pop_stat(POP *p);
319 int pop_updt(POP *p);
320 int pop_user(POP *p);
322 int pop_uidl(POP *p);
325 int pop_xover(POP *p);
328 int pop_xdele(POP *p);
330 int pop_help(POP *p);
331 state_table *pop_get_command(POP *p, char *mp);
332 void pop_lower(char *buf);
334 int pop_log(POP *p, int stat, char *format, ...)
336 __attribute__ ((format (printf, 3, 4)))
340 int pop_msg(POP *p, int stat, char *format, ...)
342 __attribute__ ((format (printf, 3, 4)))
346 int pop_maildir_info (POP*);
347 int pop_maildir_open (POP*, MsgInfoList*);
348 int pop_maildir_update (POP*);
350 int changeuser(POP*, struct passwd*);
351 void parse_header(MsgInfoList*, char*);
352 int add_missing_headers(POP*, MsgInfoList*);