Received: from localhost (daemon@localhost) by freefall.cdrom.com (8.6.10/8.6.6) with SMTP id BAA02993 ; Thu, 8 Jun 1995 01:12:21 -0700 Received: (from majordom@localhost) by freefall.cdrom.com (8.6.10/8.6.6) id BAA02851 for hackers-outgoing; Thu, 8 Jun 1995 01:09:05 -0700 Received: from risc6.unisa.ac.za (risc6.unisa.ac.za [163.200.97.6]) by freefall.cdrom.com (8.6.10/8.6.6) with SMTP id BAA02829 for ; Thu, 8 Jun 1995 01:08:49 -0700 Received: by risc6.unisa.ac.za (AIX 3.2/UCB 5.64/4.03) id AA44813; Thu, 8 Jun 1995 10:08:30 +0200 From: radova@risc6.unisa.ac.za (A. Radovanovic) Message-Id: <9506080808.AA44813@risc6.unisa.ac.za> Subject: Dynamic SLIP (tty assig.) To: hackers@freebsd.org Date: Thu, 8 Jun 1995 10:08:30 +0200 (USAST) X-Mailer: ELM [version 2.4 PL23] Content-Type: text Content-Length: 4215 Sender: hackers-owner@freebsd.org Precedence: bulk For all interested, I am sending the changes of sliplogin (BSD 2.0) which assigns IPs dynamically. The clent gets his IP when login to the server. The program works exactly the same as the distribution one, unless you create a file: /etc/sliphome/slip.ttys . If sliplogin found the file, addresses will be assigned dynamically. The file is as follows: --------------------------------------- # etc/sliphome/slip.ttys # # tty remote address # /dev/ttyd0 1.2.3.4 # this is just an example - use the real IPs /dev/ttyd1 2.3.4.5 -------------------------------------- This means that you can have as many users as you wish, but you'll need only a few IPs - one for each comm port. The client will pick up the address after login. I am not on the mailing list, so if you have any suggestions, please mail to me. Alex ----------------------------+--------------------------------- Aleksandar Radovanovic + University of South Africa + Mail: radova@risc1.unisa.ac.za Dept. of Computer Science + radova@osprey.unisa.ac.za P.O.Box 392 + WWW: http://osprey.unisa.ac.za Pretoria 0001 + Tel. (27) 12/429-6034 South Africa + Fax. (27) 12/429-6361 ----------------------------+--------------------------------- There are only a few simple changes in files: pathnames.h and sliplogin.c. It could be done better, but I'll improve it :) a) File pathnames.h: add the following line: #define _PATH_TTY2IP "/etc/sliphome/slip.ttys" b) File: sliplogin.c 1) The global variable dynamic is added: int unit; int speed; int uid; char loginargs[BUFSIZ]; char loginfile[MAXPATHLEN]; char loginname[BUFSIZ]; int dynamic = 1; /* this is added */ 2) The function findid is as follows: void findid(name) char *name; { FILE *fp; char ttydef [16]; char arguments [80]; static char slopt[5][16]; static char laddr[16]; static char raddr[16]; static char mask[16]; char user[16]; char dummyip [16]; int i, j, n; if ((fp = fopen(_PATH_TTY2IP, "r")) == NULL) { (void)fprintf(stderr, "sliplogin: %s: %s\n", _PATH_TTY2IP, strerror (errno)); syslog(LOG_ERR, "%s: %m\n", _PATH_TTY2IP); (void) fprintf (stderr, "Static SLIP used.\n"); dynamic = 0; } if (dynamic == 1) { while (fgets(arguments,sizeof(arguments)-1, fp)) { if (ferror(fp)) { (void) fclose (fp); dynamic = 0; break; } n=sscanf(arguments, "%15s%*[ \t]%15s\n", ttydef, raddr); if (ttydef[0] == '#' || isspace (ttydef [0])) continue; if (strcmp(ttydef, ttyname (0)) == 0) { (void) fclose (fp); break; } } } (void)strcpy(loginname, name); if ((fp = fopen(_PATH_ACCESS, "r")) == NULL) { (void)fprintf(stderr, "sliplogin: %s: %s\n", _PATH_ACCESS, strerror(errno)); syslog(LOG_ERR, "%s: %m\n", _PATH_ACCESS); exit(1); } while (fgets(loginargs, sizeof(loginargs) - 1, fp)) { if (ferror(fp)) break; n = sscanf(loginargs, "%15s%*[ \t]%15s%*[ \t]%15s%*[ \t]%15s%*[ \t]%15s%*[ \t]%15s%*[ \t]%15s%*[ \t]%15s%*[ \t]%15s\n", user, laddr, dummyip, mask, slopt[0], slopt[1], slopt[2], slopt[3], slopt[4]); if (dynamic == 1) sprintf (loginargs, "%s %s %s %s %s %s %s %s %s", user, laddr, raddr, mask, slopt[0], slopt[1], slopt[2], slopt[3], slopt[4]); if (user[0] == '#' || isspace(user[0])) continue; if (strcmp(user, name) != 0) continue; /* * we've found the guy we're looking for -- see if * there's a login file we can use. First check for * one specific to this host. If none found, try for * a generic one. */ (void)sprintf(loginfile, "%s.%s", _PATH_LOGIN, name); if (access(loginfile, R_OK|X_OK) != 0) { (void)strcpy(loginfile, _PATH_LOGIN); if (access(loginfile, R_OK|X_OK)) { fputs("access denied - no login file\n", stderr); syslog(LOG_ERR, "access denied for %s - no %s\n", name, _PATH_LOGIN); exit(5); } } (void) fclose(fp); (void) fprintf (stderr, "Your address is %s\n", raddr); return; } (void)fprintf(stderr, "SLIP access denied for %s\n", name); syslog(LOG_ERR, "SLIP access denied for %s\n", name); exit(4); /* NOTREACHED */ }