source: trunk/athena/bin/from/popmail.c @ 8855

Revision 8855, 4.7 KB checked in by ghudson, 28 years ago (diff)
BSD -> ANSI string and memory functions
Line 
1/*
2 * $Id: popmail.c,v 1.5 1996-09-19 22:37:02 ghudson Exp $
3 * $Source: /afs/dev.mit.edu/source/repository/athena/bin/from/popmail.c,v $
4 * $Author: ghudson $
5 *
6 */
7
8#if !defined(lint) && !defined(SABER)
9static char *rcsid = "$Id: popmail.c,v 1.5 1996-09-19 22:37:02 ghudson Exp $";
10#endif /* lint || SABER */
11
12#include <stdio.h>
13#include <sys/types.h>
14#include <sys/file.h>
15#include <sys/socket.h>
16#include <errno.h>
17#include <string.h>
18#ifdef HESIOD
19#include <hesiod.h>
20#endif
21#include <netinet/in.h>
22#include <netdb.h>
23#ifdef KPOP
24#include <krb.h>
25#endif
26
27#define NOTOK (-1)
28#define OK 0
29#define DONE 1
30
31FILE *sfi;
32FILE *sfo;
33char Errmsg[80];
34#ifdef KPOP
35char *PrincipalHostname();
36#endif
37extern int popmail_debug;
38
39pop_init(host)
40char *host;
41{
42    register struct hostent *hp;
43    register struct servent *sp;
44    int lport = IPPORT_RESERVED - 1;
45    struct sockaddr_in sin;
46    register int s;
47#ifdef KPOP
48    KTEXT ticket = (KTEXT)NULL;
49    int rem;
50    long authopts;
51#endif
52    char *get_errmsg();
53
54    hp = gethostbyname(host);
55    if (hp == NULL) {
56        (void) sprintf(Errmsg, "MAILHOST unknown: %s", host);
57        return(NOTOK);
58    }
59
60#ifdef KPOP
61    sp = getservbyname("kpop", "tcp");
62    if (sp == 0) {
63        (void) strcpy(Errmsg, "tcp/kpop: unknown service");
64        return(NOTOK);
65    }
66#else
67    sp = getservbyname("pop", "tcp");
68    if (sp == 0) {
69        (void) strcpy(Errmsg, "tcp/pop: unknown service");
70        return(NOTOK);
71    }
72#endif
73
74    sin.sin_family = hp->h_addrtype;
75    memcpy(&sin.sin_addr, hp->h_addr, hp->h_length);
76    sin.sin_port = sp->s_port;
77#ifdef KPOP
78    s = socket(AF_INET, SOCK_STREAM, 0);
79#else
80    s = rresvport(&lport);
81#endif
82    if (s < 0) {
83        (void) sprintf(Errmsg, "error creating socket: %s", get_errmsg());
84        return(NOTOK);
85    }
86
87    if (connect(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
88        (void) sprintf(Errmsg, "error during connect: %s", get_errmsg());
89        (void) close(s);
90        return(NOTOK);
91    }
92#ifdef KPOP
93    ticket = (KTEXT)malloc( sizeof(KTEXT_ST) );
94    if (ticket == NULL)
95      {
96        fprintf (stderr, "from: out of memory");
97        exit (1);
98      }
99    rem=KSUCCESS;
100    authopts = 0L;
101    rem = krb_sendauth(authopts, s, ticket, "pop", hp->h_name,
102                       (char *) krb_realmofhost(hp->h_name),
103                       0, (MSG_DAT *) 0, (CREDENTIALS *) 0,
104                       (bit_64 *) 0, (struct sockaddr_in *)0,
105                       (struct sockaddr_in *)0,"ZMAIL0.0");
106    if (rem != KSUCCESS) {
107        (void) sprintf(Errmsg, "kerberos error: %s",krb_err_txt[rem]);
108        (void) close(s);
109        return(NOTOK);
110    }
111#endif
112
113    sfi = fdopen(s, "r");
114    sfo = fdopen(s, "w");
115    if (sfi == NULL || sfo == NULL) {
116        (void) sprintf(Errmsg, "error in fdopen\n");
117        (void) close(s);
118        return(NOTOK);
119    }
120
121    return(OK);
122}
123
124/*VARARGS1*/
125pop_command(fmt, a, b, c, d)
126char *fmt;
127{
128    char buf[4096];
129
130    (void) sprintf(buf, fmt, a, b, c, d);
131
132    if (popmail_debug) fprintf(stderr, "---> %s\n", buf);
133    if (putline(buf, Errmsg, sfo) == NOTOK) return(NOTOK);
134
135    if (getline(buf, sizeof buf, sfi) != OK) {
136        (void) strcpy(Errmsg, buf);
137        return(NOTOK);
138    }
139
140    if (popmail_debug) fprintf(stderr, "<--- %s\n", buf);
141    if (*buf != '+') {
142        (void) strcpy(Errmsg, buf);
143        return(NOTOK);
144    } else {
145        return(OK);
146    }
147}
148
149   
150pop_stat(nmsgs, nbytes)
151int *nmsgs, *nbytes;
152{
153    char buf[4096];
154
155    if (popmail_debug) fprintf(stderr, "---> STAT\n");
156    if (putline("STAT", Errmsg, sfo) == NOTOK) return(NOTOK);
157
158    if (getline(buf, sizeof buf, sfi) != OK) {
159        (void) strcpy(Errmsg, buf);
160        return(NOTOK);
161    }
162
163    if (popmail_debug) fprintf(stderr, "<--- %s\n", buf);
164    if (*buf != '+') {
165        (void) strcpy(Errmsg, buf);
166        return(NOTOK);
167    } else {
168        (void) sscanf(buf, "+OK %d %d", nmsgs, nbytes);
169        return(OK);
170    }
171}
172
173
174putline(buf, err, f)
175char *buf;
176char *err;
177FILE *f;
178{
179    fprintf(f, "%s\r\n", buf);
180    (void) fflush(f);
181    if (ferror(f)) {
182        (void) strcpy(err, "lost connection");
183        return(NOTOK);
184    }
185    return(OK);
186}
187
188getline(buf, n, f)
189char *buf;
190register int n;
191FILE *f;
192{
193    register char *p;
194    int c;
195
196    p = buf;
197    while (--n > 0 && (c = fgetc(f)) != EOF)
198      if ((*p++ = c) == '\n') break;
199
200    if (ferror(f)) {
201        (void) strcpy(buf, "error on connection");
202        return (NOTOK);
203    }
204
205    if (c == EOF && p == buf) {
206        (void) strcpy(buf, "connection closed by foreign host");
207        return (DONE);
208    }
209
210    *p = '\0';
211    if (*--p == '\n') *p = '\0';
212    if (*--p == '\r') *p = '\0';
213    return(OK);
214}
215
216multiline(buf, n, f)
217char *buf;
218register int n;
219FILE *f;
220{
221    if (getline(buf, n, f) != OK) return (NOTOK);
222    if (*buf == '.') {
223        if (*(buf+1) == '\0') {
224            return (DONE);
225        } else {
226            (void) strcpy(buf, buf+1);
227        }
228    }
229    return(OK);
230}
231
232char *get_errmsg()
233{
234    extern int errno, sys_nerr;
235    extern char *sys_errlist[];
236    char *s;
237
238    if (errno < sys_nerr)
239      s = sys_errlist[errno];
240    else
241      s = "unknown error";
242    return(s);
243}
244
Note: See TracBrowser for help on using the repository browser.