9 date 92.01.31.22.37.24; author jromine; state Exp;
14 date 92.01.31.22.37.02; author jromine; state Exp;
25 @*** empty log message ***
28 @/* kclient.c - connect to a server via knetd, kerberos authenticated */
30 static char ident[]= "$Id: kclient.c,v 1.1 1992/01/31 22:37:02 jromine Exp jromine $";
34 #include "../h/strings.h"
37 #include "../zotnet/mts/mts.h"
42 #include <sys/types.h>
43 #include <sys/socket.h>
44 #include <netinet/in.h>
46 #include <arpa/inet.h>
51 static CREDENTIALS cred;
52 static MSG_DAT msg_data;
53 static KTEXT ticket = (KTEXT)NULL;
54 static Key_schedule schedule;
75 extern char *sys_errlist[];
78 int a_addrtype; /* assumes AF_INET for inet_netof () */
84 #define a_net un.un_net
85 #define a_addr un.un_addr
88 static struct addrent *ne, *nz;
89 static struct addrent nets[MAXNETS];
91 static struct addrent *he, *hz;
92 static struct addrent hosts[MAXHOSTS];
96 char realservice[] = "kpop";
98 char krb_realm[REALM_SZ];
99 char *PrincipalHostname();
101 /* redefine routine names for kerberos to make the loader happy */
102 #define client kclient
106 static int rcaux (struct servent *, struct hostent *, int, char *, char *);
107 static int getport (int, int, char *);
108 static int inet (struct hostent *, int);
110 static int rcaux (), getport (), inet ();
112 static int brkany ();
116 char *getcpy (), **brkstring (), **copyip ();
120 int client (args, protocol, service, rproto, response)
129 char *arguments[MAXARGS];
130 register struct hostent *hp;
132 register struct netent *np;
134 register struct servent *sp;
136 #define realservice service
139 if ((sp = getservbyname (realservice, protocol)) == NULL) {
140 (void) sprintf (response, "%s/%s: unknown service", realservice, protocol);
145 if (args != NULL && *args != 0)
146 ap = copyip (brkstring (getcpy (args), " ", "\n"), ap);
148 if (servers != NULL && *servers != 0)
149 ap = copyip (brkstring (getcpy (servers), " ", "\n"), ap);
150 if (ap == arguments) {
151 *ap++ = getcpy ("localhost");
155 nz = (ne = nets) + sizeof nets / sizeof nets[0];
156 hz = (he = hosts) + sizeof hosts / sizeof hosts[0];
158 for (ap = arguments; *ap; ap++) {
161 if (np = getnetbyname (*ap + 1)) {
163 while (hp = gethostent ())
164 if (np -> n_addrtype == hp -> h_addrtype
165 && inet (hp, np -> n_net)) {
166 switch (sd = rcaux (sp, hp, rproto, response, service)) {
184 if (hp = gethostbyname (*ap)) {
185 switch (sd = rcaux (sp, hp, rproto, response, service)) {
199 (void) strcpy (response, "no servers available");
205 static int rcaux (sp, hp, rproto, response, service)
206 register struct servent *sp;
207 register struct hostent *hp;
209 register char *response;
210 char *service; /* what they really want to talk to */
214 register struct addrent *ap;
215 struct sockaddr_in in_socket;
216 register struct sockaddr_in *isock = &in_socket;
221 for (ap = nets; ap < ne; ap++)
222 if (ap -> a_addrtype == hp -> h_addrtype && inet (hp, ap -> a_net))
225 for (ap = hosts; ap < he; ap++)
226 if (ap -> a_addrtype == hp -> h_addrtype
227 && bcmp (ap -> a_addr, hp -> h_addr, hp -> h_length) == 0)
230 if ((sd = getport (rproto, hp -> h_addrtype, response)) == NOTOK)
233 bzero ((char *) isock, sizeof *isock);
234 isock -> sin_family = hp -> h_addrtype;
235 isock -> sin_port = sp -> s_port;
236 bcopy (hp -> h_addr, (char *) &isock -> sin_addr, hp -> h_length);
238 if (connect (sd, (struct sockaddr *) isock, sizeof *isock) == NOTOK)
244 ne -> a_addrtype = hp -> h_addrtype;
245 bcopy (hp -> h_addr, (char *) &in, sizeof in);
246 ne -> a_net = inet_netof (in);
256 he -> a_addrtype = hp -> h_addrtype;
257 bcopy (hp -> h_addr, he -> a_addr, hp -> h_length);
264 ticket = (KTEXT)malloc( sizeof(KTEXT_ST) );
265 rem = krb_sendauth(0L, sd, ticket, service, hp->h_name,
266 (char *) krb_realmofhost(hp->h_name),
267 (unsigned long)0, &msg_data, &cred, schedule,
268 (struct sockaddr_in *)NULL,
269 (struct sockaddr_in *)NULL,
271 if (rem != KSUCCESS) {
273 (void) strcpy(response, "Post office refused connection: ");
274 (void) strcat(response, krb_err_txt[rem]);
284 static int getport (rproto, addrtype, response)
287 register char *response;
291 struct sockaddr_in in_socket,
294 if (rproto && addrtype != AF_INET) {
295 (void) sprintf (response, "reserved ports not supported for af=%d",
301 if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK) {
302 (void) sprintf (response, "unable to create socket: %s",
303 errno > 0 && errno < sys_nerr ? sys_errlist[errno]
313 bzero ((char *) isock, sizeof *isock);
314 isock -> sin_family = addrtype;
315 for (port = IPPORT_RESERVED - 1;;) {
316 isock -> sin_port = htons ((u_short) port);
317 if (bind (sd, (struct sockaddr *) isock, sizeof *isock) != NOTOK)
323 if (--port <= IPPORT_RESERVED / 2) {
324 (void) strcpy (response, "ports available");
330 (void) sprintf (response, "unable to bind socket: %s",
331 errno > 0 && errno < sys_nerr ? sys_errlist[errno]
341 static int inet (hp, net)
342 register struct hostent *hp;
347 bcopy (hp -> h_addr, (char *) &in, sizeof in);
348 return (inet_netof (in) == net);
353 /* static copies of three MH subroutines... (sigh) */
355 static char *broken[MAXARGS + 1];
358 static char **brkstring (strg, brksep, brkterm)
360 register char *brksep,
369 for (bi = 0; bi < MAXARGS; bi++) {
370 while (brkany (c = *sp, brksep))
372 if (!c || brkany (c, brkterm)) {
379 while ((c = *++sp) && !brkany (c, brksep) && !brkany (c, brkterm))
388 static brkany (chr, strg)
395 for (sp = strg; *sp; sp++)
402 static char **copyip (p, q)
414 static char *getcpy (str)
419 if ((cp = malloc ((unsigned) (strlen (str) + 1))) == NULL)
422 (void) strcpy (cp, str);
436 * $Source: /paris/source/4.3/new/mh.6.6/support/pop/RCS/kclient.c,v $
437 * $Header: /paris/source/4.3/new/mh.6.6/support/pop/RCS/kclient.c,v 1.2 89/11/11 03:35:14 probe Exp $
442 static char ident[]= "$Id: /paris/source/4.3/new/mh.6.6/support/pop/RCS/kclient.c,v 1.2 89/11/11 03:35:14 probe Exp $";
444 /* kclient.c - connect to a server via knetd, kerberos authenticated */