freebsd-skq/usr.sbin/ppp/systems.c
amurai eeb422fed8 New user Process PPP based on iij-ppp0.94beta2.
o Supporting SYNC SIO device (But need a device driver)
     - add "set speed sync"
   o Fixing bug for Predictor-1 function.
   o Add new parameter that re-sent interval for set timeout commands.
   o Improving RTT (Round Trip Time) and reducing processor time.
     - Previous Timer service was using polling, and now using
       SIGALRM ;-)
     - A 0.94beta2 will not work correctly....

   -- Follows are additinal feature not including 0.94beta2
   o Support Proxy ARP
     - add "enable/disable proxy" commands
   o Marging common routine in CHAP/PAP.
   o Enhancing LCP/IPCP log information.
   o Support local Authfication connection on port 300x and tty.
     - You can set up pair of your "hostname -s" and
       password in ppp.secret. if either ppp.secret file nor
       your hostname line don't exist, It will notify a message
       and working as same as previous version.(Backword compatibility)
     - If you did set up them, It's allow connection but nothing to do
       except help and passwd command.
     - add "passwd yourpasswd" commands
   o Support afilter - keep Alive filter that a packet can send/receiving
     according to ifilter/ofilter but doesn't count it as preventing idle
     timer expires.
     - Same syntax of other filters.
   o Fixing bugs reported by current user for previous one. Thanks !!

Reviewed by: Atsushi Murai (amurai@spec.co.jp)
1995-02-26 12:18:08 +00:00

222 lines
4.0 KiB
C

/*
* System configuration routines
*
* Written by Toshiharu OHNO (tony-o@iij.ad.jp)
*
* Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the Internet Initiative Japan, Inc. The name of the
* IIJ may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id:$
*
* TODO:
*/
#include "fsm.h"
#include "vars.h"
#include "ipcp.h"
#include "pathnames.h"
#include "vars.h"
extern void DecodeCommand();
static int uid, gid;
static int euid, egid;
static int usermode;
void
GetUid()
{
uid = getuid();
gid = getgid();
euid = geteuid();
egid = getegid();
usermode = 0;
}
static void
SetUserId()
{
if (!usermode) {
#ifdef __FreeBSD__
setruid(euid);
seteuid(uid);
setrgid(egid);
setegid(gid);
#else
setreuid(euid, uid);
setregid(egid, gid);
#endif
usermode = 1;
}
}
static void
SetPppId()
{
if (usermode) {
#ifdef __FreeBSD__
setruid(uid);
seteuid(euid);
setrgid(gid);
setegid(egid);
#else
setreuid(uid, euid);
setregid(gid, egid);
#endif
usermode = 0;
}
}
FILE *
OpenSecret(file)
char *file;
{
FILE *fp;
char *cp;
char line[100];
fp = NULL;
cp = getenv("HOME");
if (cp) {
SetUserId();
sprintf(line, "%s/.%s", cp, file);
fp = fopen(line, "r");
}
if (fp == NULL) {
SetPppId();
sprintf(line, "%s/%s",_PATH_PPP, file);
fp = fopen(line, "r");
}
if (fp == NULL) {
fprintf(stderr, "can't open %s.\n", line);
SetPppId();
return(NULL);
}
return(fp);
}
void
CloseSecret(fp)
FILE *fp;
{
fclose(fp);
SetPppId();
}
int
SelectSystem(name, file)
char *name;
char *file;
{
FILE *fp;
char *cp, *wp;
int n;
int val = -1;
u_char olauth;
char line[200];
fp = NULL;
cp = getenv("HOME");
if (cp) {
SetUserId();
sprintf(line, "%s/.%s", cp, file);
fp = fopen(line, "r");
}
if (fp == NULL) {
SetPppId(); /* fix from pdp@ark.jr3uom.iijnet.or.jp */
sprintf(line, "%s/%s",_PATH_PPP, file);
fp = fopen(line, "r");
}
if (fp == NULL) {
fprintf(stderr, "can't open %s.\n", line);
SetPppId();
return(-1);
}
#ifdef DEBUG
fprintf(stderr, "checking %s (%s).\n", name, line);
#endif
while (fgets(line, sizeof(line), fp)) {
cp = line;
switch (*cp) {
case '#': /* comment */
break;
case ' ':
case '\t':
break;
default:
wp = strpbrk(cp, ":\n");
*wp = '\0';
if (strcmp(cp, name) == 0) {
while (fgets(line, sizeof(line), fp)) {
cp = line;
if (*cp == ' ' || *cp == '\t') {
n = strspn(cp, " \t");
cp += n;
#ifdef DEBUG
fprintf(stderr, "%s", cp);
#endif
SetPppId();
olauth = VarLocalAuth;
VarLocalAuth = LOCAL_AUTH;
DecodeCommand(cp, strlen(cp), 0);
VarLocalAuth = olauth;
SetUserId();
} else if (*cp == '#') {
continue;
} else
break;
}
fclose(fp);
SetPppId();
return(0);
}
break;
}
}
fclose(fp);
SetPppId();
return(val);
}
int
LoadCommand(list, argc, argv)
struct cmdtab *list;
int argc;
char **argv;
{
char *name;
if (argc > 0)
name = *argv;
else
name = "default";
if (SelectSystem(name, CONFFILE) < 0) {
printf("%s: not found.\n", name);
return(-1);
}
return(1);
}
extern struct in_addr ifnetmask;
int
SaveCommand(list, argc, argv)
struct cmdtab *list;
int argc;
char **argv;
{
printf("save command is not implemented (yet).\n");
return(1);
}