6 * (c) Copyright 1988 by the Massachusetts Institute of Technology.
7 * For copying and distribution information, please see the file
12 static char *rcsid_reg_stubs_c = "$Header$";
15 #include <mit-copyright.h>
17 #include <sys/types.h>
19 #include <sys/socket.h>
20 #include <netinet/in.h>
27 #include "ureg_proto.h"
30 static int reg_sock = -1;
31 static int seq_no = 0;
33 #define UNKNOWN_HOST -1
34 #define UNKNOWN_SERVICE -2
41 struct sockaddr_in sin;
42 extern char *getenv(), **hes_resolve();
44 initialize_ureg_error_table();
49 host = getenv("REGSERVER");
51 if (!host || (strlen(host) == 0)) {
52 p = hes_resolve("registration", "sloc");
56 if (!host || (strlen(host) == 0)) {
57 host = strsave(SMS_SERVER);
61 hp = gethostbyname(host);
62 if (hp == NULL) return UNKNOWN_HOST;
64 sp = getservbyname("sms_ureg", "udp");
66 if (sp == NULL) return UNKNOWN_SERVICE;
68 (void) close(reg_sock);
69 reg_sock = socket(AF_INET, SOCK_DGRAM, 0);
70 if (reg_sock < 0) return errno;
72 bzero((char *)&sin, sizeof(sin));
73 sin.sin_port = sp->s_port;
74 bcopy(hp->h_addr, (char *)&sin.sin_addr, sizeof(struct in_addr));
75 sin.sin_family = AF_INET;
77 if (connect(reg_sock, &sin, sizeof(sin)) < 0)
83 verify_user(first, last, idnumber, hashidnumber, login)
84 char *first, *last, *idnumber, *hashidnumber, *login;
87 int version = ntohl((u_long)1);
88 int call = ntohl((u_long)UREG_VERIFY_USER);
91 register char *bp = buf;
95 bcopy((char *)&version, bp, sizeof(int));
98 bcopy((char *)&seq_no, bp, sizeof(int));
102 bcopy((char *)&call, bp, sizeof(int));
106 (void) strcpy(bp, first);
109 (void) strcpy(bp, last);
112 len = strlen(idnumber) + 1;
113 bcopy(idnumber, crypt_src, len);
115 bcopy(hashidnumber, crypt_src+len, 13);
117 des_string_to_key(hashidnumber, key);
118 des_key_sched(key, ks);
119 des_pcbc_encrypt(crypt_src, bp, len+13, ks, key, DES_ENCRYPT);
122 return do_call(buf, len, seq_no, login);
125 do_operation(first, last, idnumber, hashidnumber, data, opcode)
126 char *first, *last, *idnumber, *hashidnumber, *data;
130 int version = ntohl((u_long)1);
131 int call = ntohl(opcode);
134 register char *bp = buf;
137 char crypt_src[1024];
140 bcopy((char *)&version, bp, sizeof(int));
143 bcopy((char *)&seq_no, bp, sizeof(int));
147 bcopy((char *)&call, bp, sizeof(int));
151 (void) strcpy(bp, first);
154 (void) strcpy(bp, last);
157 len = strlen(idnumber) + 1;
160 bcopy(idnumber, crypt_src, len);
163 bcopy(hashidnumber, cbp, 14);
166 len = strlen(data) + 1;
167 bcopy(data, cbp, len);
170 len = cbp - crypt_src;
171 des_string_to_key(hashidnumber, key);
172 des_key_sched(key, ks);
173 des_pcbc_encrypt(crypt_src, bp, len, ks, key, 1);
174 len = ((len + 7) >> 3) << 3;
178 return do_call(buf, len, seq_no, 0);
182 grab_login(first, last, idnumber, hashidnumber, login)
183 char *first, *last, *idnumber, *hashidnumber, *login;
185 return(do_operation(first, last, idnumber, hashidnumber, login,
186 UREG_RESERVE_LOGIN));
189 enroll_login(first, last, idnumber, hashidnumber, login)
190 char *first, *last, *idnumber, *hashidnumber, *login;
192 return(do_operation(first, last, idnumber, hashidnumber, login,
196 set_password(first, last, idnumber, hashidnumber, password)
197 char *first, *last, *idnumber, *hashidnumber, *password;
199 return(do_operation(first, last, idnumber, hashidnumber, password,
203 get_krb(first, last, idnumber, hashidnumber, password)
204 char *first, *last, *idnumber, *hashidnumber, *password;
206 return(do_operation(first, last, idnumber, hashidnumber, password,
210 static do_call(buf, len, seq_no, login)
216 struct timeval timeout;
223 if (write(reg_sock, buf, len) != len) return errno;
226 FD_SET(reg_sock, &set);
231 struct sockaddr_in sin;
232 int addrlen = sizeof(sin);
237 rtn = select(reg_sock+1, &set, (fd_set *)0, (fd_set *)0, &timeout);
240 else if (rtn < 0) return errno;
242 len = recvfrom(reg_sock, ibuf, BUFSIZ, 0, &sin, &addrlen);
243 if (len < 0) return errno;
244 if (len < 12) return UREG_BROKEN_PACKET;
245 bcopy(ibuf, (char *)&vno, sizeof(long));
246 vno = ntohl((u_long)vno);
247 if (vno != 1) continue;
248 bcopy(ibuf + 4, (char *)&sno, sizeof(long));
250 if (sno != seq_no) continue;
252 bcopy(ibuf + 8, (char *)&stat, sizeof(long));
253 stat = ntohl((u_long)stat);
254 if (login && len > 12) {
255 bcopy(ibuf+12, login, len-12);
256 login[len-12] = '\0';
261 } while (++retry < 10);