6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
9 * Revision 1.5 1988-08-17 18:09:42 mar
10 * changed server host from "dodo.mit.edu" to "sms.mit.edu"
12 * Revision 1.4 88/08/07 22:20:21 mar
13 * changed server hostname to dodo for testing.
14 * changed timeout back to 30 seconds (it gets retried 10 times)
16 * Revision 1.3 88/08/03 20:16:10 mar
17 * increase timeout; don't copy login out of packet unless packet is long enough
19 * Revision 1.2 87/09/04 22:57:33 wesommer
20 * Rearranged timeouts, max retransmits.
22 * Revision 1.1 87/08/22 18:39:29 wesommer
28 static char *rcsid_reg_stubs_c = "$Header$";
31 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <netinet/in.h>
39 #include "ureg_proto.h"
42 static int reg_sock = -1;
44 #define UNKNOWN_HOST -1
45 #define UNKNOWN_SERVICE -2
51 struct sockaddr_in sin;
56 hp = gethostbyname("sms.mit.edu");
57 if (hp == NULL) return UNKNOWN_HOST;
59 sp = getservbyname("sms_ureg", "udp");
61 if (sp == NULL) return UNKNOWN_SERVICE;
63 (void) close(reg_sock);
64 reg_sock = socket(AF_INET, SOCK_DGRAM, 0);
65 if (reg_sock < 0) return errno;
67 bzero((char *)&sin, sizeof(sin));
68 sin.sin_port = sp->s_port;
69 bcopy(hp->h_addr, (char *)&sin.sin_addr, sizeof(struct in_addr));
70 sin.sin_family = AF_INET;
72 if (connect(reg_sock, &sin, sizeof(sin)) < 0)
77 static int seq_no = 0;
80 verify_user(first, last, idnumber, hashidnumber, login)
81 char *first, *last, *idnumber, *hashidnumber, *login;
84 int version = ntohl((u_long)1);
85 int call = ntohl((u_long)UREG_VERIFY_USER);
88 register char *bp = buf;
92 bcopy((char *)&version, bp, sizeof(int));
95 bcopy((char *)&seq_no, bp, sizeof(int));
99 bcopy((char *)&call, bp, sizeof(int));
103 (void) strcpy(bp, first);
106 (void) strcpy(bp, last);
109 len = strlen(idnumber) + 1;
110 bcopy(idnumber, crypt_src, len);
112 bcopy(hashidnumber, crypt_src+len, 13);
114 string_to_key(hashidnumber, key);
116 pcbc_encrypt(crypt_src, bp, len+14, ks, key, 1);
119 return do_call(buf, len, seq_no, login);
122 grab_login(first, last, idnumber, hashidnumber, login)
123 char *first, *last, *idnumber, *hashidnumber, *login;
126 int version = ntohl((u_long)1);
127 int call = ntohl((u_long)UREG_RESERVE_LOGIN);
130 register char *bp = buf;
133 char crypt_src[1024];
136 bcopy((char *)&version, bp, sizeof(int));
139 bcopy((char *)&seq_no, bp, sizeof(int));
143 bcopy((char *)&call, bp, sizeof(int));
147 (void) strcpy(bp, first);
150 (void) strcpy(bp, last);
153 len = strlen(idnumber) + 1;
156 bcopy(idnumber, crypt_src, len);
159 bcopy(hashidnumber, cbp, 14);
162 len = strlen(login) + 1;
163 bcopy(login, cbp, len);
166 len = cbp - crypt_src;
167 string_to_key(hashidnumber, key);
169 pcbc_encrypt(crypt_src, bp, len, ks, key, 1);
171 for (i = 0; i < len; i++) {
172 printf("%02.2x ", (unsigned char)bp[i]);
176 len = ((len + 7) >> 3) << 3;
180 return do_call(buf, len, seq_no, 0);
184 set_password(first, last, idnumber, hashidnumber, password)
185 char *first, *last, *idnumber, *hashidnumber, *password;
188 int version = ntohl((u_long)1);
189 int call = ntohl((u_long)UREG_SET_PASSWORD);
192 register char *bp = buf;
195 char crypt_src[1024];
198 bcopy((char *)&version, bp, sizeof(int));
201 bcopy((char *)&seq_no, bp, sizeof(int));
205 bcopy((char *)&call, bp, sizeof(int));
209 (void) strcpy(bp, first);
212 (void) strcpy(bp, last);
215 len = strlen(idnumber) + 1;
218 bcopy(idnumber, crypt_src, len);
221 bcopy(hashidnumber, cbp, 14);
224 len = strlen(password) + 1;
225 bcopy(password, cbp, len);
228 len = cbp - crypt_src;
229 string_to_key(hashidnumber, key);
231 pcbc_encrypt(crypt_src, bp, len, ks, key, 1);
233 for (i = 0; i < len; i++) {
234 printf("%02.2x ", (unsigned char)bp[i]);
238 len = ((len + 7) >> 3) << 3;
242 return do_call(buf, len, seq_no, 0);
246 static do_call(buf, len, seq_no, login)
252 struct timeval timeout;
259 if (write(reg_sock, buf, len) != len) return errno;
262 FD_SET(reg_sock, &set);
267 struct sockaddr_in sin;
268 int addrlen = sizeof(sin);
273 rtn = select(reg_sock+1, &set, (fd_set *)0, (fd_set *)0, &timeout);
276 else if (rtn < 0) return errno;
278 len = recvfrom(reg_sock, ibuf, BUFSIZ, 0, &sin, &addrlen);
279 if (len < 0) return errno;
280 if (len < 12) return UREG_BROKEN_PACKET;
281 bcopy(ibuf, (char *)&vno, sizeof(long));
282 vno = ntohl((u_long)vno);
283 if (vno != 1) continue;
284 bcopy(ibuf + 4, (char *)&sno, sizeof(long));
286 if (sno != seq_no) continue;
288 bcopy(ibuf + 8, (char *)&stat, sizeof(long));
289 stat = ntohl((u_long)stat);
290 if (login && len > 12) {
291 bcopy(ibuf+12, login, len-12);
292 login[len-12] = '\0';
297 } while (++retry < 10);
305 * c-continued-statement-offset: 4
307 * c-argdecl-indent: 4