annotate lib-src/pop.c @ 17846:c427501449a1

(display_text_line): Move the code to fill out the line with the newline's face to the end of the newline code. Add changes (commented out) to record ellipsis positions in charstarts.
author Richard M. Stallman <rms@gnu.org>
date Fri, 16 May 1997 07:32:59 +0000
parents 975d093d45fb
children f1f7c254aa77
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 /* pop.c: client routines for talking to a POP3-protocol post-office server
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
2 Copyright (c) 1991, 1993, 1996 Free Software Foundation, Inc.
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 Written by Jonathan Kamens, jik@security.ov.com.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 This file is part of GNU Emacs.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 GNU Emacs is free software; you can redistribute it and/or modify
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 any later version.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 GNU General Public License for more details.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
20 Boston, MA 02111-1307, USA. */
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
22 #ifdef HAVE_CONFIG_H
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
23 #define NO_SHORTNAMES /* Tell config not to load remap.h */
9592
132798b0352b Include ../src/config.h.
Richard M. Stallman <rms@gnu.org>
parents: 9591
diff changeset
24 #include <../src/config.h>
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
25 #else
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
26 #define MAIL_USE_POP
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
27 #endif
9592
132798b0352b Include ../src/config.h.
Richard M. Stallman <rms@gnu.org>
parents: 9591
diff changeset
28
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
29 #ifdef MAIL_USE_POP
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
30
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
31 #ifdef HAVE_CONFIG_H
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
32 /* Cancel these substitutions made in config.h */
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
33 #undef open
9594
7461e7aa4f3c (open, close, read, write): Add #undefs.
Richard M. Stallman <rms@gnu.org>
parents: 9592
diff changeset
34 #undef read
7461e7aa4f3c (open, close, read, write): Add #undefs.
Richard M. Stallman <rms@gnu.org>
parents: 9592
diff changeset
35 #undef write
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
36 #undef close
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
37 #endif
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 #include <sys/types.h>
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
40 #ifdef WINDOWSNT
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
41 #include "ntlib.h"
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
42 #include <winsock.h>
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
43 #undef SOCKET_ERROR
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
44 #define RECV(s,buf,len,flags) recv(s,buf,len,flags)
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
45 #define SEND(s,buf,len,flags) send(s,buf,len,flags)
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
46 #define CLOSESOCKET(s) closesocket(s)
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
47 #else
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 #include <netinet/in.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 #include <sys/socket.h>
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
50 #define RECV(s,buf,len,flags) read(s,buf,len)
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
51 #define SEND(s,buf,len,flags) write(s,buf,len)
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
52 #define CLOSESOCKET(s) close(s)
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
53 #endif
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 #include <pop.h>
9600
f0d3266e07d7 Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents: 9594
diff changeset
55
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 #ifdef sun
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 #include <malloc.h>
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
58 #endif /* sun */
9600
f0d3266e07d7 Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents: 9594
diff changeset
59
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 #ifdef HESIOD
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 #include <hesiod.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 * It really shouldn't be necessary to put this declaration here, but
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 * the version of hesiod.h that Athena has installed in release 7.2
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 * doesn't declare this function; I don't know if the 7.3 version of
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 * hesiod.h does.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 extern struct servent *hes_getservbyname (/* char *, char * */);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 #endif
9600
f0d3266e07d7 Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents: 9594
diff changeset
70
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 #include <pwd.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 #include <netdb.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 #include <errno.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 #include <stdio.h>
9600
f0d3266e07d7 Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents: 9594
diff changeset
75
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 #ifdef KERBEROS
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 #ifndef KRB5
15934
3553d10dbcf5 Reverse conditional in previous change.
Richard M. Stallman <rms@gnu.org>
parents: 15919
diff changeset
78 #ifndef SOLARIS2
9591
0774e217e8aa Don't declare malloc, realloc, free.
Richard M. Stallman <rms@gnu.org>
parents: 9158
diff changeset
79 #include <des.h>
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 #include <krb.h>
15934
3553d10dbcf5 Reverse conditional in previous change.
Richard M. Stallman <rms@gnu.org>
parents: 15919
diff changeset
81 #else /* not SOLARIS2 */
15919
645e96bad5ad Include des.h krb.h with no dir name if SOLARIS2.
Richard M. Stallman <rms@gnu.org>
parents: 15108
diff changeset
82 #include <kerberos/des.h>
645e96bad5ad Include des.h krb.h with no dir name if SOLARIS2.
Richard M. Stallman <rms@gnu.org>
parents: 15108
diff changeset
83 #include <kerberos/krb.h>
15934
3553d10dbcf5 Reverse conditional in previous change.
Richard M. Stallman <rms@gnu.org>
parents: 15919
diff changeset
84 #endif /* not SOLARIS2 */
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 #else /* KRB5 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 #include <krb5/krb5.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 #include <krb5/ext-proto.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 #include <ctype.h>
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 #endif /* KRB5 */
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
90 #endif /* KERBEROS */
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
92 extern char *getenv (/* char * */);
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
93 extern char *getlogin (/* void */);
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
94 extern char *getpass (/* char * */);
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
95 extern char *strerror (/* int */);
14238
b55e97028105 (pop_retrieve, getline): Avoid type clashes.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
96 extern char *index ();
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
97
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
98 #ifdef KERBEROS
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
99 #ifndef KRB5
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 extern int krb_sendauth (/* long, int, KTEXT, char *, char *, char *,
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
101 u_long, MSG_DAT *, CREDENTIALS *, Key_schedule,
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
102 struct sockaddr_in *, struct sockaddr_in *,
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
103 char * */);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 extern char *krb_realmofhost (/* char * */);
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
105 #endif /* ! KRB5 */
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
106 #endif /* KERBEROS */
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
108 #ifndef WINDOWSNT
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
109 #if !defined(HAVE_H_ERRNO) || !defined(HAVE_CONFIG_H)
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 extern int h_errno;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 #endif
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
112 #endif
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 static int socket_connection (/* char *, int */);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 static char *getline (/* popserver */);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 static int sendline (/* popserver, char * */);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 static int fullwrite (/* int, char *, int */);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 static int getok (/* popserver */);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 #if 0
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 static int gettermination (/* popserver */);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 static void pop_trash (/* popserver */);
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
123 static char *find_crlf (/* char * */);
9591
0774e217e8aa Don't declare malloc, realloc, free.
Richard M. Stallman <rms@gnu.org>
parents: 9158
diff changeset
124
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 #define ERROR_MAX 80 /* a pretty arbitrary size */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 #define POP_PORT 110
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 #define KPOP_PORT 1109
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
128 #ifdef WINDOWSNT
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
129 #define POP_SERVICE "pop3" /* we don't want the POP2 port! */
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
130 #else
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 #define POP_SERVICE "pop"
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
132 #endif
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 #ifdef KERBEROS
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 #ifdef KRB5
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 #define KPOP_SERVICE "k5pop";
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 #else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 #define KPOP_SERVICE "kpop"
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 char pop_error[ERROR_MAX];
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 int pop_debug = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 #ifndef min
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 #define min(a,b) (((a) < (b)) ? (a) : (b))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 * Function: pop_open (char *host, char *username, char *password,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 * int flags)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 * Purpose: Establishes a connection with a post-office server, and
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 * completes the authorization portion of the session.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 * host The server host with which the connection should be
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 * established. Optional. If omitted, internal
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 * heuristics will be used to determine the server host,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 * if possible.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 * username
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 * The username of the mail-drop to access. Optional.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 * If omitted, internal heuristics will be used to
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 * determine the username, if possible.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 * password
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 * The password to use for authorization. If omitted,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 * internal heuristics will be used to determine the
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 * password, if possible.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 * flags A bit mask containing flags controlling certain
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 * functions of the routine. Valid flags are defined in
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 * the file pop.h
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 * Return value: Upon successful establishment of a connection, a
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 * non-null popserver will be returned. Otherwise, null will be
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 * returned, and the string variable pop_error will contain an
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 * explanation of the error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 popserver
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 pop_open (host, username, password, flags)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 char *host;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 char *username;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 char *password;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 int flags;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 int sock;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 /* Determine the user name */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 if (! username)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 username = getenv ("USER");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 if (! (username && *username))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 username = getlogin ();
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 if (! (username && *username))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 struct passwd *passwd;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 passwd = getpwuid (getuid ());
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 if (passwd && passwd->pw_name && *passwd->pw_name)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 username = passwd->pw_name;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 strcpy (pop_error, "Could not determine username");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 * Determine the mail host.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 if (! host)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 host = getenv ("MAILHOST");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 #ifdef HESIOD
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 if ((! host) && (! (flags & POP_NO_HESIOD)))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 struct hes_postoffice *office;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 office = hes_getmailhost (username);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 if (office && office->po_type && (! strcmp (office->po_type, "POP"))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 && office->po_name && *office->po_name && office->po_host
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 && *office->po_host)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 host = office->po_host;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 username = office->po_name;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 #ifdef MAILHOST
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 if (! host)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 host = MAILHOST;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 if (! host)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 strcpy (pop_error, "Could not determine POP server");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 /* Determine the password */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 #ifdef KERBEROS
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 #define DONT_NEED_PASSWORD (! (flags & POP_NO_KERBEROS))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 #else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 #define DONT_NEED_PASSWORD 0
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 if ((! password) && (! DONT_NEED_PASSWORD))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 if (! (flags & POP_NO_GETPASS))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 password = getpass ("Enter POP password:");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 if (! password)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 strcpy (pop_error, "Could not determine POP password");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 if (password)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 flags |= POP_NO_KERBEROS;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 password = username;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 sock = socket_connection (host, flags);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 if (sock == -1)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 server = (popserver) malloc (sizeof (struct _popserver));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 if (! server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 strcpy (pop_error, "Out of memory in pop_open");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 server->buffer = (char *) malloc (GETLINE_MIN);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 if (! server->buffer)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 strcpy (pop_error, "Out of memory in pop_open");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 free ((char *) server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 server->file = sock;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 server->data = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 server->buffer_index = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 server->buffer_size = GETLINE_MIN;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 server->in_multi = 0;
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
295 server->trash_started = 0;
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 if (getok (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 * I really shouldn't use the pop_error variable like this, but....
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 if (strlen (username) > ERROR_MAX - 6)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 pop_close (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 "Username too long; recompile pop.c with larger ERROR_MAX");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 sprintf (pop_error, "USER %s", username);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 if (sendline (server, pop_error) || getok (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 if (strlen (password) > ERROR_MAX - 6)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 pop_close (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 "Password too long; recompile pop.c with larger ERROR_MAX");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 sprintf (pop_error, "PASS %s", password);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 if (sendline (server, pop_error) || getok (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 return (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 * Function: pop_stat
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 * Purpose: Issue the STAT command to the server and return (in the
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 * value parameters) the number of messages in the maildrop and
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 * the total size of the maildrop.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 * Return value: 0 on success, or non-zero with an error in pop_error
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 * in failure.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 * Side effects: On failure, may make further operations on the
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 * connection impossible.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 pop_stat (server, count, size)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 int *count;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 int *size;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 char *fromserver;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 if (server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 strcpy (pop_error, "In multi-line query in pop_stat");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 if (sendline (server, "STAT") || (! (fromserver = getline (server))))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 if (strncmp (fromserver, "+OK ", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 if (0 == strncmp (fromserver, "-ERR", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 strncpy (pop_error, fromserver, ERROR_MAX);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 "Unexpected response from POP server in pop_stat");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 *count = atoi (&fromserver[4]);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 fromserver = index (&fromserver[4], ' ');
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 if (! fromserver)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 "Badly formatted response from server in pop_stat");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 *size = atoi (fromserver + 1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 * Function: pop_list
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 * Purpose: Performs the POP "list" command and returns (in value
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 * parameters) two malloc'd zero-terminated arrays -- one of
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 * message IDs, and a parallel one of sizes.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 * server The pop connection to talk to.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 * message The number of the one message about which to get
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 * information, or 0 to get information about all
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 * messages.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 * Return value: 0 on success, non-zero with error in pop_error on
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 * failure.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 * Side effects: On failure, may make further operations on the
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 * connection impossible.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 pop_list (server, message, IDs, sizes)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 int message;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 int **IDs;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 int **sizes;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 int how_many, i;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 char *fromserver;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 if (server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 strcpy (pop_error, "In multi-line query in pop_list");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 if (message)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 how_many = 1;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 int count, size;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 if (pop_stat (server, &count, &size))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 how_many = count;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 *IDs = (int *) malloc ((how_many + 1) * sizeof (int));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 *sizes = (int *) malloc ((how_many + 1) * sizeof (int));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 if (! (*IDs && *sizes))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 strcpy (pop_error, "Out of memory in pop_list");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 if (message)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 sprintf (pop_error, "LIST %d", message);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 if (sendline (server, pop_error))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 if (! (fromserver = getline (server)))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 if (strncmp (fromserver, "+OK ", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 if (! strncmp (fromserver, "-ERR", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 strncpy (pop_error, fromserver, ERROR_MAX);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 "Unexpected response from server in pop_list");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 (*IDs)[0] = atoi (&fromserver[4]);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 fromserver = index (&fromserver[4], ' ');
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 if (! fromserver)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 "Badly formatted response from server in pop_list");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 (*sizes)[0] = atoi (fromserver);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 (*IDs)[1] = (*sizes)[1] = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 if (pop_multi_first (server, "LIST", &fromserver))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 for (i = 0; i < how_many; i++)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 if (pop_multi_next (server, &fromserver))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 (*IDs)[i] = atoi (fromserver);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 fromserver = index (fromserver, ' ');
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 if (! fromserver)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 "Badly formatted response from server in pop_list");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 (*sizes)[i] = atoi (fromserver);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 if (pop_multi_next (server, &fromserver))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 else if (fromserver)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 "Too many response lines from server in pop_list");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 free ((char *) *IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 free ((char *) *sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 (*IDs)[i] = (*sizes)[i] = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 * Function: pop_retrieve
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 * Purpose: Retrieve a specified message from the maildrop.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 * server The server to retrieve from.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 * message The message number to retrieve.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 * markfrom
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 * If true, then mark the string "From " at the beginning
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 * of lines with '>'.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 * Return value: A string pointing to the message, if successful, or
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 * null with pop_error set if not.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555 * Side effects: May kill connection on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
556 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 char *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 pop_retrieve (server, message, markfrom)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 int message;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 int markfrom;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 int *IDs, *sizes, bufsize, fromcount = 0, cp = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 char *ptr, *fromserver;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 int ret;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 if (server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 strcpy (pop_error, "In multi-line query in pop_retrieve");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 if (pop_list (server, message, &IDs, &sizes))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 if (pop_retrieve_first (server, message, &fromserver))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 * The "5" below is an arbitrary constant -- I assume that if
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 * there are "From" lines in the text to be marked, there
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 * probably won't be more than 5 of them. If there are, I
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 * allocate more space for them below.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 bufsize = sizes[0] + (markfrom ? 5 : 0);
14238
b55e97028105 (pop_retrieve, getline): Avoid type clashes.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
588 ptr = (char *)malloc (bufsize);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589 free ((char *) IDs);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
590 free ((char *) sizes);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
591
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
592 if (! ptr)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
593 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
594 strcpy (pop_error, "Out of memory in pop_retrieve");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595 pop_retrieve_flush (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
596 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 while (! (ret = pop_retrieve_next (server, &fromserver)))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 int linesize;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
602
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603 if (! fromserver)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 ptr[cp] = '\0';
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 return (ptr);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608 if (markfrom && fromserver[0] == 'F' && fromserver[1] == 'r' &&
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609 fromserver[2] == 'o' && fromserver[3] == 'm' &&
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
610 fromserver[4] == ' ')
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
611 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 if (++fromcount == 5)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 bufsize += 5;
14238
b55e97028105 (pop_retrieve, getline): Avoid type clashes.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
615 ptr = (char *)realloc (ptr, bufsize);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
616 if (! ptr)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
618 strcpy (pop_error, "Out of memory in pop_retrieve");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619 pop_retrieve_flush (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 fromcount = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
623 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624 ptr[cp++] = '>';
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
626 linesize = strlen (fromserver);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
627 bcopy (fromserver, &ptr[cp], linesize);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
628 cp += linesize;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629 ptr[cp++] = '\n';
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632 if (ret)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
634 free (ptr);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
635 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
636 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
637 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
638
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640 pop_retrieve_first (server, message, response)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
642 int message;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 char **response;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 sprintf (pop_error, "RETR %d", message);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
646 return (pop_multi_first (server, pop_error, response));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
647 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
648
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
649 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
650 pop_retrieve_next (server, line)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
651 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
652 char **line;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
653 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
654 return (pop_multi_next (server, line));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
655 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
656
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
657 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
658 pop_retrieve_flush (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
659 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
660 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
661 return (pop_multi_flush (server));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
665 pop_top_first (server, message, lines, response)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
666 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
667 int message, lines;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
668 char **response;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
669 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
670 sprintf (pop_error, "TOP %d %d", message, lines);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
671 return (pop_multi_first (server, pop_error, response));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
672 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
673
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
674 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 pop_top_next (server, line)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
677 char **line;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
678 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
679 return (pop_multi_next (server, line));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
680 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
681
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
682 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
683 pop_top_flush (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
684 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
685 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
686 return (pop_multi_flush (server));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
687 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
688
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
689 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
690 pop_multi_first (server, command, response)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
691 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692 char *command;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
693 char **response;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
694 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
695 if (server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
697 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
698 "Already in multi-line query in pop_multi_first");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
699 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
701
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
702 if (sendline (server, command) || (! (*response = getline (server))))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
703 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
704 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
705 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
707 if (0 == strncmp (*response, "-ERR", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
708 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 strncpy (pop_error, *response, ERROR_MAX);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
710 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
711 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712 else if (0 == strncmp (*response, "+OK", 3))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
714 for (*response += 3; **response == ' '; (*response)++) /* empty */;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
715 server->in_multi = 1;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
716 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
717 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
720 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
721 "Unexpected response from server in pop_multi_first");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
722 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
723 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
725
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727 pop_multi_next (server, line)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
728 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
729 char **line;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
730 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 char *fromserver;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
733 if (! server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
734 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735 strcpy (pop_error, "Not in multi-line query in pop_multi_next");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
736 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
737 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
738
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
739 fromserver = getline (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
740 if (! fromserver)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
741 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
742 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
743 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
744
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
745 if (fromserver[0] == '.')
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
746 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
747 if (! fromserver[1])
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
748 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
749 *line = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
750 server->in_multi = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
751 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
752 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
753 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
754 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
755 *line = fromserver + 1;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
756 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
757 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
758 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
759 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
760 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
761 *line = fromserver;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
762 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
763 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
764 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
765
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
766 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
767 pop_multi_flush (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
768 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
769 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
770 char *line;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
772 if (! server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
773 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
774 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
775 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
776
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
777 while (! pop_multi_next (server, &line))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
778 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
779 if (! line)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
780 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
781 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
782 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
783 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
784
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
785 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
786 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
787
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
788 /* Function: pop_delete
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
789 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
790 * Purpose: Delete a specified message.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
791 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
792 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
793 * server Server from which to delete the message.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
794 * message Message to delete.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
795 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
796 * Return value: 0 on success, non-zero with error in pop_error
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
797 * otherwise.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
798 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
799 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
800 pop_delete (server, message)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
801 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
802 int message;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
803 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
804 if (server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
805 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
806 strcpy (pop_error, "In multi-line query in pop_delete");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
807 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
808 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
809
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
810 sprintf (pop_error, "DELE %d", message);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
811
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
812 if (sendline (server, pop_error) || getok (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
813 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
814
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
815 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
816 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
817
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
818 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
819 * Function: pop_noop
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
820 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
821 * Purpose: Send a noop command to the server.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
822 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
823 * Argument:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
824 * server The server to send to.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
825 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
826 * Return value: 0 on success, non-zero with error in pop_error
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
827 * otherwise.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
828 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
829 * Side effects: Closes connection on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
830 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
831 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
832 pop_noop (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
833 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
834 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
835 if (server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
836 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
837 strcpy (pop_error, "In multi-line query in pop_noop");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
838 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
839 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
840
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
841 if (sendline (server, "NOOP") || getok (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
842 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
843
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
844 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
845 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
846
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
847 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
848 * Function: pop_last
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
849 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
850 * Purpose: Find out the highest seen message from the server.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
851 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
852 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853 * server The server.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
855 * Return value: If successful, the highest seen message, which is
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
856 * greater than or equal to 0. Otherwise, a negative number with
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
857 * the error explained in pop_error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
859 * Side effects: Closes the connection on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
860 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
861 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
862 pop_last (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
863 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
864 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
865 char *fromserver;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
866
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
867 if (server->in_multi)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
868 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
869 strcpy (pop_error, "In multi-line query in pop_last");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
870 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
871 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
872
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
873 if (sendline (server, "LAST"))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
874 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
875
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
876 if (! (fromserver = getline (server)))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
877 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
878
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
879 if (! strncmp (fromserver, "-ERR", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
880 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 strncpy (pop_error, fromserver, ERROR_MAX);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
882 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
883 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 else if (strncmp (fromserver, "+OK ", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
885 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 strcpy (pop_error, "Unexpected response from server in pop_last");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
888 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
889 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
890 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
891 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
892 return (atoi (&fromserver[4]));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
893 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
894 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
895
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
896 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
897 * Function: pop_reset
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
898 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
899 * Purpose: Reset the server to its initial connect state
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
900 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
901 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
902 * server The server.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
903 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
904 * Return value: 0 for success, non-0 with error in pop_error
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
905 * otherwise.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
906 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
907 * Side effects: Closes the connection on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
908 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
909 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
910 pop_reset (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
911 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
912 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
913 if (pop_retrieve_flush (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
914 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
915 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
916 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
917
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
918 if (sendline (server, "RSET") || getok (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
919 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
920
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
921 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
922 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
923
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
924 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
925 * Function: pop_quit
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
926 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
927 * Purpose: Quit the connection to the server,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
928 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
929 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
930 * server The server to quit.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
931 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
932 * Return value: 0 for success, non-zero otherwise with error in
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
933 * pop_error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
934 *
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 9674
diff changeset
935 * Side Effects: The popserver passed in is unusable after this
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
936 * function is called, even if an error occurs.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
937 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
938 int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
939 pop_quit (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
940 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
941 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
942 int ret = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
943
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
944 if (server->file >= 0)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
945 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
946 if (pop_retrieve_flush (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
947 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
948 ret = -1;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
949 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
950
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
951 if (sendline (server, "QUIT") || getok (server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
952 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
953 ret = -1;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
954 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
955
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
956 close (server->file);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
957 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
958
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
959 if (server->buffer)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
960 free (server->buffer);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
961 free ((char *) server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
962
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
963 return (ret);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
964 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
965
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
966 #ifdef WINDOWSNT
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
967 static int have_winsock = 0;
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
968 #endif
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
969
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
970 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
971 * Function: socket_connection
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
972 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
973 * Purpose: Opens the network connection with the mail host, without
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
974 * doing any sort of I/O with it or anything.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
975 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
977 * host The host to which to connect.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
978 * flags Option flags.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
979 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
980 * Return value: A file descriptor indicating the connection, or -1
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
981 * indicating failure, in which case an error has been copied
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
982 * into pop_error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
983 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984 static int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
985 socket_connection (host, flags)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986 char *host;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
987 int flags;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
988 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
989 struct hostent *hostent;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
990 struct servent *servent;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
991 struct sockaddr_in addr;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
992 char found_port = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
993 char *service;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
994 int sock;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
995 #ifdef KERBEROS
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
996 #ifdef KRB5
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
997 krb5_error_code rem;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
998 krb5_ccache ccdef;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
999 krb5_principal client, server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1000 krb5_error *err_ret;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1001 register char *cp;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1002 #else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1003 KTEXT ticket;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1004 MSG_DAT msg_data;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1005 CREDENTIALS cred;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1006 Key_schedule schedule;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1007 int rem;
16603
a12b8815bcf0 gethostbyname() may return a pointer to static data, which is
Charles Hannum <mycroft@gnu.org>
parents: 15934
diff changeset
1008 char *realhost;
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1009 #endif /* KRB5 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1010 #endif /* KERBEROS */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1011
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1012 int try_count = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1013
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1014 #ifdef WINDOWSNT
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1015 {
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1016 WSADATA winsockData;
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1017 if (WSAStartup (0x101, &winsockData) == 0)
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1018 have_winsock = 1;
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1019 }
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1020 #endif
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1021
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1022 do
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1023 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1024 hostent = gethostbyname (host);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1025 try_count++;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1026 if ((! hostent) && ((h_errno != TRY_AGAIN) || (try_count == 5)))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1027 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1028 strcpy (pop_error, "Could not determine POP server's address");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1029 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1030 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1031 } while (! hostent);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1032
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1033 bzero ((char *) &addr, sizeof (addr));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1034 addr.sin_family = AF_INET;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1035
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1036 #ifdef KERBEROS
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1037 service = (flags & POP_NO_KERBEROS) ? POP_SERVICE : KPOP_SERVICE;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1038 #else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 service = POP_SERVICE;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1041
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1042 #ifdef HESIOD
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1043 if (! (flags & POP_NO_HESIOD))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1044 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1045 servent = hes_getservbyname (service, "tcp");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1046 if (servent)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1047 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1048 addr.sin_port = servent->s_port;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049 found_port = 1;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1050 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1051 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1053 if (! found_port)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1054 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1055 servent = getservbyname (service, "tcp");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1056 if (servent)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1057 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1058 addr.sin_port = servent->s_port;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1059 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1060 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1061 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1062 #ifdef KERBEROS
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1063 addr.sin_port = htons ((flags & POP_NO_KERBEROS) ?
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1064 POP_PORT : KPOP_PORT);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1065 #else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1066 addr.sin_port = htons (POP_PORT);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1067 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1068 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1069 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1070
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1071 #define SOCKET_ERROR "Could not create socket for POP connection: "
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1072
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1073 sock = socket (PF_INET, SOCK_STREAM, 0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1074 if (sock < 0)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1075 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1076 strcpy (pop_error, SOCKET_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1077 strncat (pop_error, strerror (errno),
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1078 ERROR_MAX - sizeof (SOCKET_ERROR));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1079 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1080
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1081 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1082
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1083 while (*hostent->h_addr_list)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1084 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1085 bcopy (*hostent->h_addr_list, (char *) &addr.sin_addr,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1086 hostent->h_length);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1087 if (! connect (sock, (struct sockaddr *) &addr, sizeof (addr)))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1088 break;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1089 hostent->h_addr_list++;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1090 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1091
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1092 #define CONNECT_ERROR "Could not connect to POP server: "
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1093
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1094 if (! *hostent->h_addr_list)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1095 {
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1096 CLOSESOCKET (sock);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1097 strcpy (pop_error, CONNECT_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1098 strncat (pop_error, strerror (errno),
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1099 ERROR_MAX - sizeof (CONNECT_ERROR));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1100 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1101
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1102 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1103
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1104 #ifdef KERBEROS
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1105 #define KRB_ERROR "Kerberos error connecting to POP server: "
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1106 if (! (flags & POP_NO_KERBEROS))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1107 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1108 #ifdef KRB5
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1109 krb5_init_ets ();
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1110
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1111 if (rem = krb5_cc_default (&ccdef))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1112 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1113 krb5error:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1114 strcpy (pop_error, KRB_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1115 strncat (pop_error, error_message (rem),
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1116 ERROR_MAX - sizeof(KRB_ERROR));
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1117 CLOSESOCKET (sock);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1118 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1119 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1120
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1121 if (rem = krb5_cc_get_principal (ccdef, &client))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1122 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1123 goto krb5error;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1124 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1125
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1126 for (cp = hostent->h_name; *cp; cp++)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1127 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1128 if (isupper (*cp))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1129 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1130 *cp = tolower (*cp);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1131 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1132 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1133
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1134 if (rem = krb5_sname_to_principal (hostent->h_name, POP_SERVICE,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1135 FALSE, &server))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1136 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1137 goto krb5error;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1138 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1139
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1140 rem = krb5_sendauth ((krb5_pointer) &sock, "KPOPV1.0", client, server,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1141 AP_OPTS_MUTUAL_REQUIRED,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1142 0, /* no checksum */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1143 0, /* no creds, use ccache instead */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1144 ccdef,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1145 0, /* don't need seq # */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1146 0, /* don't need subsession key */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1147 &err_ret,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1148 0); /* don't need reply */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1149 krb5_free_principal (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1150 if (rem)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1151 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1152 if (err_ret && err_ret->text.length)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1153 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1154 strcpy (pop_error, KRB_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1155 strncat (pop_error, error_message (rem),
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1156 ERROR_MAX - sizeof (KRB_ERROR));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1157 strncat (pop_error, " [server says '",
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1158 ERROR_MAX - strlen (pop_error) - 1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1159 strncat (pop_error, err_ret->text.data,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1160 min (ERROR_MAX - strlen (pop_error) - 1,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1161 err_ret->text.length));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1162 strncat (pop_error, "']",
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1163 ERROR_MAX - strlen (pop_error) - 1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1164 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1165 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1166 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1167 strcpy (pop_error, KRB_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1168 strncat (pop_error, error_message (rem),
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1169 ERROR_MAX - sizeof (KRB_ERROR));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1170 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1171 if (err_ret)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1172 krb5_free_error (err_ret);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1173
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1174 CLOSESOCKET (sock);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1175 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1176 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1177 #else /* ! KRB5 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1178 ticket = (KTEXT) malloc (sizeof (KTEXT_ST));
16603
a12b8815bcf0 gethostbyname() may return a pointer to static data, which is
Charles Hannum <mycroft@gnu.org>
parents: 15934
diff changeset
1179 realhost = strdup (hostent->h_name);
a12b8815bcf0 gethostbyname() may return a pointer to static data, which is
Charles Hannum <mycroft@gnu.org>
parents: 15934
diff changeset
1180 rem = krb_sendauth (0L, sock, ticket, "pop", realhost,
a12b8815bcf0 gethostbyname() may return a pointer to static data, which is
Charles Hannum <mycroft@gnu.org>
parents: 15934
diff changeset
1181 (char *) krb_realmofhost (realhost),
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1182 (unsigned long) 0, &msg_data, &cred, schedule,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1183 (struct sockaddr_in *) 0,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1184 (struct sockaddr_in *) 0,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1185 "KPOPV0.1");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1186 free ((char *) ticket);
16697
83946dc6f4e7 (socket_connection): Free realhost after using it.
Richard M. Stallman <rms@gnu.org>
parents: 16603
diff changeset
1187 free (realhost);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1188 if (rem != KSUCCESS)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1189 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1190 strcpy (pop_error, KRB_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1191 strncat (pop_error, krb_err_txt[rem],
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1192 ERROR_MAX - sizeof (KRB_ERROR));
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1193 CLOSESOCKET (sock);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1194 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1195 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1196 #endif /* KRB5 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1197 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1198 #endif /* KERBEROS */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1199
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1200 return (sock);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1201 } /* socket_connection */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1202
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1203 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1204 * Function: getline
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1205 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1206 * Purpose: Get a line of text from the connection and return a
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1207 * pointer to it. The carriage return and linefeed at the end of
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1208 * the line are stripped, but periods at the beginnings of lines
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1209 * are NOT dealt with in any special way.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1210 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1211 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1212 * server The server from which to get the line of text.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1213 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1214 * Returns: A non-null pointer if successful, or a null pointer on any
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1215 * error, with an error message copied into pop_error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1216 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1217 * Notes: The line returned is overwritten with each call to getline.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1218 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1219 * Side effects: Closes the connection on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1220 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1221 static char *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1222 getline (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1223 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1224 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1225 #define GETLINE_ERROR "Error reading from server: "
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1226
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1227 int ret;
9674
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1228 int search_offset = 0;
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1229
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1230 if (server->data)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1231 {
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1232 char *cp = find_crlf (server->buffer + server->buffer_index);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1233 if (cp)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1234 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1235 int found;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1236 int data_used;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1237
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1238 found = server->buffer_index;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1239 data_used = (cp + 2) - server->buffer - found;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1240
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1241 *cp = '\0'; /* terminate the string to be returned */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1242 server->data -= data_used;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1243 server->buffer_index += data_used;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1244
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1245 if (pop_debug)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1246 fprintf (stderr, "<<< %s\n", server->buffer + found);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1247 return (server->buffer + found);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1248 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1249 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1250 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1251 bcopy (server->buffer + server->buffer_index,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1252 server->buffer, server->data);
9674
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1253 /* Record the fact that we've searched the data already in
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1254 the buffer for a CRLF, so that when we search below, we
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1255 don't have to search the same data twice. There's a "-
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1256 1" here to account for the fact that the last character
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1257 of the data we have may be the CR of a CRLF pair, of
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1258 which we haven't read the second half yet, so we may have
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1259 to search it again when we read more data. */
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1260 search_offset = server->data - 1;
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1261 server->buffer_index = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1262 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1263 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1264 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1265 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1266 server->buffer_index = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1267 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1268
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1269 while (1)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1270 {
9674
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1271 /* There's a "- 1" here to leave room for the null that we put
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1272 at the end of the read data below. We put the null there so
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1273 that find_crlf knows where to stop when we call it. */
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1274 if (server->data == server->buffer_size - 1)
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1275 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1276 server->buffer_size += GETLINE_INCR;
14238
b55e97028105 (pop_retrieve, getline): Avoid type clashes.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
1277 server->buffer = (char *)realloc (server->buffer, server->buffer_size);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1278 if (! server->buffer)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1279 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1280 strcpy (pop_error, "Out of memory in getline");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1281 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1282 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1283 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1284 }
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1285 ret = RECV (server->file, server->buffer + server->data,
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1286 server->buffer_size - server->data - 1, 0);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1287 if (ret < 0)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1288 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1289 strcpy (pop_error, GETLINE_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1290 strncat (pop_error, strerror (errno),
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1291 ERROR_MAX - sizeof (GETLINE_ERROR));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1292 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1293 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1294 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1295 else if (ret == 0)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1296 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1297 strcpy (pop_error, "Unexpected EOF from server in getline");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1298 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1299 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1300 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1301 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1302 {
9591
0774e217e8aa Don't declare malloc, realloc, free.
Richard M. Stallman <rms@gnu.org>
parents: 9158
diff changeset
1303 char *cp;
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1304 server->data += ret;
9591
0774e217e8aa Don't declare malloc, realloc, free.
Richard M. Stallman <rms@gnu.org>
parents: 9158
diff changeset
1305 server->buffer[server->data] = '\0';
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1306
9674
e5a897cf215d (getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents: 9613
diff changeset
1307 cp = find_crlf (server->buffer + search_offset);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1308 if (cp)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1309 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1310 int data_used = (cp + 2) - server->buffer;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1311 *cp = '\0';
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1312 server->data -= data_used;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1313 server->buffer_index = data_used;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1314
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1315 if (pop_debug)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1316 fprintf (stderr, "<<< %s\n", server->buffer);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1317 return (server->buffer);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1318 }
17683
975d093d45fb (getline): Don't miss CRLF pairs when the CR and LF are
Richard M. Stallman <rms@gnu.org>
parents: 16697
diff changeset
1319 /* As above, the "- 1" here is to account for the fact that
975d093d45fb (getline): Don't miss CRLF pairs when the CR and LF are
Richard M. Stallman <rms@gnu.org>
parents: 16697
diff changeset
1320 we may have read a CR without its accompanying LF. */
975d093d45fb (getline): Don't miss CRLF pairs when the CR and LF are
Richard M. Stallman <rms@gnu.org>
parents: 16697
diff changeset
1321 search_offset += ret - 1;
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1322 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1323 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1324
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1325 /* NOTREACHED */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1326 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1327
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1328 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1329 * Function: sendline
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1330 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1331 * Purpose: Sends a line of text to the POP server. The line of text
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1332 * passed into this function should NOT have the carriage return
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1333 * and linefeed on the end of it. Periods at beginnings of lines
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1334 * will NOT be treated specially by this function.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1335 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1336 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1337 * server The server to which to send the text.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1338 * line The line of text to send.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1339 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1340 * Return value: Upon successful completion, a value of 0 will be
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1341 * returned. Otherwise, a non-zero value will be returned, and
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1342 * an error will be copied into pop_error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1343 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1344 * Side effects: Closes the connection on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1345 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1346 static int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1347 sendline (server, line)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1348 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1349 char *line;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1350 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1351 #define SENDLINE_ERROR "Error writing to POP server: "
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1352 int ret;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1353
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1354 ret = fullwrite (server->file, line, strlen (line));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1355 if (ret >= 0)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1356 { /* 0 indicates that a blank line was written */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1357 ret = fullwrite (server->file, "\r\n", 2);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1358 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1359
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1360 if (ret < 0)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1361 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1362 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1363 strcpy (pop_error, SENDLINE_ERROR);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1364 strncat (pop_error, strerror (errno),
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1365 ERROR_MAX - sizeof (SENDLINE_ERROR));
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1366 return (ret);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1367 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1368
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1369 if (pop_debug)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1370 fprintf (stderr, ">>> %s\n", line);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1371
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1372 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1373 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1374
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1375 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1376 * Procedure: fullwrite
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1377 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1378 * Purpose: Just like write, but keeps trying until the entire string
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1379 * has been written.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1380 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1381 * Return value: Same as write. Pop_error is not set.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1382 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1383 static int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1384 fullwrite (fd, buf, nbytes)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1385 int fd;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1386 char *buf;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1387 int nbytes;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1388 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1389 char *cp;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1390 int ret;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1391
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1392 cp = buf;
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1393 while ((ret = SEND (fd, cp, nbytes, 0)) > 0)
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1394 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1395 cp += ret;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1396 nbytes -= ret;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1397 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1398
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1399 return (ret);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1400 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1401
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1402 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1403 * Procedure getok
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1404 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1405 * Purpose: Reads a line from the server. If the return indicator is
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1406 * positive, return with a zero exit status. If not, return with
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1407 * a negative exit status.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1408 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1409 * Arguments:
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1410 * server The server to read from.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1411 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1412 * Returns: 0 for success, else for failure and puts error in pop_error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1413 *
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 9674
diff changeset
1414 * Side effects: On failure, may make the connection unusable.
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1415 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1416 static int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1417 getok (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1418 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1419 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1420 char *fromline;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1421
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1422 if (! (fromline = getline (server)))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1423 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1424 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1425 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1426
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1427 if (! strncmp (fromline, "+OK", 3))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1428 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1429 else if (! strncmp (fromline, "-ERR", 4))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1430 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1431 strncpy (pop_error, fromline, ERROR_MAX);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1432 pop_error[ERROR_MAX-1] = '\0';
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1433 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1434 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1435 else
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1436 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1437 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1438 "Unexpected response from server; expecting +OK or -ERR");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1439 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1440 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1441 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1442 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1443
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1444 #if 0
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1445 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1446 * Function: gettermination
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1447 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1448 * Purpose: Gets the next line and verifies that it is a termination
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1449 * line (nothing but a dot).
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1450 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1451 * Return value: 0 on success, non-zero with pop_error set on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1452 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1453 * Side effects: Closes the connection on error.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1454 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1455 static int
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1456 gettermination (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1457 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1458 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1459 char *fromserver;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1460
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1461 fromserver = getline (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1462 if (! fromserver)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1463 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1464
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1465 if (strcmp (fromserver, "."))
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1466 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1467 strcpy (pop_error,
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1468 "Unexpected response from server in gettermination");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1469 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1470 return (-1);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1471 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1472
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1473 return (0);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1474 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1475 #endif
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1476
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1477 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1478 * Function pop_close
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1479 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1480 * Purpose: Close a pop connection, sending a "RSET" command to try to
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1481 * preserve any changes that were made and a "QUIT" command to
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1482 * try to get the server to quit, but ignoring any responses that
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1483 * are received.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1484 *
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 9674
diff changeset
1485 * Side effects: The server is unusable after this function returns.
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1486 * Changes made to the maildrop since the session was started (or
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1487 * since the last pop_reset) may be lost.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1488 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1489 void
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1490 pop_close (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1491 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1492 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1493 pop_trash (server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1494 free ((char *) server);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1495
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1496 return;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1497 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1498
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1499 /*
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1500 * Function: pop_trash
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1501 *
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1502 * Purpose: Like pop_close or pop_quit, but doesn't deallocate the
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1503 * memory associated with the server. It is legal to call
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1504 * pop_close or pop_quit after this function has been called.
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1505 */
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1506 static void
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1507 pop_trash (server)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1508 popserver server;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1509 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1510 if (server->file >= 0)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1511 {
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1512 /* avoid recursion; sendline can call pop_trash */
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1513 if (server->trash_started)
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1514 return;
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1515 server->trash_started = 1;
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1516
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1517 sendline (server, "RSET");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1518 sendline (server, "QUIT");
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1519
15108
442458addd50 (SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents: 15102
diff changeset
1520 CLOSESOCKET (server->file);
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1521 server->file = -1;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1522 if (server->buffer)
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1523 {
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1524 free (server->buffer);
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1525 server->buffer = 0;
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1526 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1527 }
15102
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1528
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1529 #ifdef WINDOWSNT
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1530 if (have_winsock)
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1531 WSACleanup ();
ed550d0805ca [WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents: 14238
diff changeset
1532 #endif
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1533 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1534
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1535 /* Return a pointer to the first CRLF in IN_STRING,
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1536 or 0 if it does not contain one. */
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1537
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1538 static char *
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1539 find_crlf (in_string)
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1540 char *in_string;
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1541 {
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1542 while (1)
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1543 {
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1544 if (! *in_string)
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1545 return (0);
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1546 else if (*in_string == '\r')
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1547 {
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1548 if (*++in_string == '\n')
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1549 return (in_string - 1);
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1550 }
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1551 else
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1552 in_string++;
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1553 }
9613
530b4511e5b3 Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents: 9600
diff changeset
1554 /* NOTREACHED */
9158
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1555 }
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1556
939488de5d3f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1557 #endif /* MAIL_USE_POP */