6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
9 * Revision 1.2 1987-09-04 22:57:33 wesommer
10 * Rearranged timeouts, max retransmits.
12 * Revision 1.1 87/08/22 18:39:29 wesommer
18 static char *rcsid_reg_stubs_c = "$Header$";
21 #include <sys/types.h>
23 #include <sys/socket.h>
24 #include <netinet/in.h>
29 #include "ureg_proto.h"
32 static int reg_sock = -1;
34 #define UNKNOWN_HOST -1
35 #define UNKNOWN_SERVICE -2
41 struct sockaddr_in sin;
46 hp = gethostbyname("sms.mit.edu");
47 if (hp == NULL) return UNKNOWN_HOST;
49 sp = getservbyname("sms_ureg", "udp");
51 if (sp == NULL) return UNKNOWN_SERVICE;
53 (void) close(reg_sock);
54 reg_sock = socket(AF_INET, SOCK_DGRAM, 0);
55 if (reg_sock < 0) return errno;
57 bzero((char *)&sin, sizeof(sin));
58 sin.sin_port = sp->s_port;
59 bcopy(hp->h_addr, (char *)&sin.sin_addr, sizeof(struct in_addr));
60 sin.sin_family = AF_INET;
62 if (connect(reg_sock, &sin, sizeof(sin)) < 0)
67 static int seq_no = 0;
70 verify_user(first, last, idnumber, hashidnumber, login)
71 char *first, *last, *idnumber, *hashidnumber, *login;
74 int version = ntohl((u_long)1);
75 int call = ntohl((u_long)UREG_VERIFY_USER);
78 register char *bp = buf;
82 bcopy((char *)&version, bp, sizeof(int));
85 bcopy((char *)&seq_no, bp, sizeof(int));
89 bcopy((char *)&call, bp, sizeof(int));
93 (void) strcpy(bp, first);
96 (void) strcpy(bp, last);
99 len = strlen(idnumber) + 1;
100 bcopy(idnumber, crypt_src, len);
102 bcopy(hashidnumber, crypt_src+len, 13);
104 string_to_key(hashidnumber, key);
106 pcbc_encrypt(crypt_src, bp, len+14, ks, key, 1);
109 return do_call(buf, len, seq_no, login);
112 grab_login(first, last, idnumber, hashidnumber, login)
113 char *first, *last, *idnumber, *hashidnumber, *login;
116 int version = ntohl((u_long)1);
117 int call = ntohl((u_long)UREG_RESERVE_LOGIN);
120 register char *bp = buf;
124 char crypt_src[1024];
127 bcopy((char *)&version, bp, sizeof(int));
130 bcopy((char *)&seq_no, bp, sizeof(int));
134 bcopy((char *)&call, bp, sizeof(int));
138 (void) strcpy(bp, first);
141 (void) strcpy(bp, last);
144 len = strlen(idnumber) + 1;
147 bcopy(idnumber, crypt_src, len);
150 bcopy(hashidnumber, cbp, 14);
153 len = strlen(login) + 1;
154 bcopy(login, cbp, len);
157 len = cbp - crypt_src;
158 string_to_key(hashidnumber, key);
160 pcbc_encrypt(crypt_src, bp, len, ks, key, 1);
162 for (i = 0; i < len; i++) {
163 printf("%02.2x ", (unsigned char)bp[i]);
167 len = ((len + 7) >> 3) << 3;
171 return do_call(buf, len, seq_no, 0);
175 set_password(first, last, idnumber, hashidnumber, password)
176 char *first, *last, *idnumber, *hashidnumber, *password;
179 int version = ntohl((u_long)1);
180 int call = ntohl((u_long)UREG_SET_PASSWORD);
183 register char *bp = buf;
187 char crypt_src[1024];
190 bcopy((char *)&version, bp, sizeof(int));
193 bcopy((char *)&seq_no, bp, sizeof(int));
197 bcopy((char *)&call, bp, sizeof(int));
201 (void) strcpy(bp, first);
204 (void) strcpy(bp, last);
207 len = strlen(idnumber) + 1;
210 bcopy(idnumber, crypt_src, len);
213 bcopy(hashidnumber, cbp, 14);
216 len = strlen(password) + 1;
217 bcopy(password, cbp, len);
220 len = cbp - crypt_src;
221 string_to_key(hashidnumber, key);
223 pcbc_encrypt(crypt_src, bp, len, ks, key, 1);
225 for (i = 0; i < len; i++) {
226 printf("%02.2x ", (unsigned char)bp[i]);
230 len = ((len + 7) >> 3) << 3;
234 return do_call(buf, len, seq_no, 0);
238 static do_call(buf, len, seq_no, login)
244 struct timeval timeout;
251 if (write(reg_sock, buf, len) != len) return errno;
254 FD_SET(reg_sock, &set);
259 struct sockaddr_in sin;
260 int addrlen = sizeof(sin);
265 rtn = select(reg_sock+1, &set, (fd_set *)0, (fd_set *)0, &timeout);
268 else if (rtn < 0) return errno;
270 len = recvfrom(reg_sock, ibuf, BUFSIZ, 0, &sin, &addrlen);
271 if (len < 0) return errno;
272 if (len < 12) return UREG_BROKEN_PACKET;
273 bcopy(ibuf, (char *)&vno, sizeof(long));
274 vno = ntohl((u_long)vno);
275 if (vno != 1) continue;
276 bcopy(ibuf + 4, (char *)&sno, sizeof(long));
278 if (sno != seq_no) continue;
280 bcopy(ibuf + 8, (char *)&stat, sizeof(long));
281 stat = ntohl((u_long)stat);
283 bcopy(ibuf+12, login, len-12);
284 login[len-12] = '\0';
288 } while (++retry < 10);
296 * c-continued-statement-offset: 4
298 * c-argdecl-indent: 4