1995-01-31 06:29:58 +00:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*
|
1997-09-04 00:38:22 +00:00
|
|
|
* $Id: systems.c,v 1.15 1997/08/31 22:59:49 brian Exp $
|
1995-05-30 03:57:47 +00:00
|
|
|
*
|
1995-01-31 06:29:58 +00:00
|
|
|
* TODO:
|
|
|
|
*/
|
|
|
|
#include "fsm.h"
|
1997-05-26 00:44:10 +00:00
|
|
|
#include "loadalias.h"
|
1995-01-31 06:29:58 +00:00
|
|
|
#include "vars.h"
|
|
|
|
#include "ipcp.h"
|
1995-02-02 01:54:27 +00:00
|
|
|
#include "pathnames.h"
|
1995-02-26 12:18:08 +00:00
|
|
|
#include "vars.h"
|
1997-06-25 19:30:05 +00:00
|
|
|
#include "server.h"
|
1997-08-25 00:29:32 +00:00
|
|
|
#include "command.h"
|
1995-01-31 06:29:58 +00:00
|
|
|
|
|
|
|
extern void DecodeCommand();
|
|
|
|
|
|
|
|
static int uid, gid;
|
|
|
|
static int euid, egid;
|
|
|
|
static int usermode;
|
|
|
|
|
1997-05-26 00:44:10 +00:00
|
|
|
int
|
|
|
|
OrigUid()
|
|
|
|
{
|
1997-08-25 00:29:32 +00:00
|
|
|
return uid;
|
1997-05-26 00:44:10 +00:00
|
|
|
}
|
|
|
|
|
1995-01-31 06:29:58 +00:00
|
|
|
void
|
|
|
|
GetUid()
|
|
|
|
{
|
|
|
|
uid = getuid();
|
|
|
|
gid = getgid();
|
|
|
|
euid = geteuid();
|
|
|
|
egid = getegid();
|
|
|
|
usermode = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
SetUserId()
|
|
|
|
{
|
|
|
|
if (!usermode) {
|
1997-05-10 01:22:19 +00:00
|
|
|
if (setreuid(euid, uid) == -1) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogERROR, "unable to setreuid!\n");
|
1997-06-25 19:30:05 +00:00
|
|
|
ServerClose();
|
1997-05-10 01:22:19 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if (setregid(egid, gid) == -1) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogERROR, "unable to setregid!\n");
|
1997-06-25 19:30:05 +00:00
|
|
|
ServerClose();
|
1997-05-10 01:22:19 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
1995-01-31 06:29:58 +00:00
|
|
|
usermode = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
SetPppId()
|
|
|
|
{
|
|
|
|
if (usermode) {
|
1997-05-10 01:22:19 +00:00
|
|
|
if (setreuid(uid, euid) == -1) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogERROR, "unable to setreuid!\n");
|
1997-06-25 19:30:05 +00:00
|
|
|
ServerClose();
|
1997-05-10 01:22:19 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if (setregid(gid, egid) == -1) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogERROR, "unable to setregid!\n");
|
1997-06-25 19:30:05 +00:00
|
|
|
ServerClose();
|
1997-05-10 01:22:19 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
1995-01-31 06:29:58 +00:00
|
|
|
usermode = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
FILE *
|
1997-08-25 00:29:32 +00:00
|
|
|
OpenSecret(char *file)
|
1995-01-31 06:29:58 +00:00
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
char *cp;
|
|
|
|
char line[100];
|
|
|
|
|
|
|
|
fp = NULL;
|
|
|
|
cp = getenv("HOME");
|
|
|
|
if (cp) {
|
|
|
|
SetUserId();
|
1996-12-15 20:39:30 +00:00
|
|
|
snprintf(line, sizeof line, "%s/.%s", cp, file);
|
1995-01-31 06:29:58 +00:00
|
|
|
fp = fopen(line, "r");
|
|
|
|
}
|
|
|
|
if (fp == NULL) {
|
|
|
|
SetPppId();
|
1996-12-15 20:39:30 +00:00
|
|
|
snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file);
|
1995-01-31 06:29:58 +00:00
|
|
|
fp = fopen(line, "r");
|
|
|
|
}
|
|
|
|
if (fp == NULL) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogWARN, "OpenSecret: Can't open %s.\n", line);
|
1995-01-31 06:29:58 +00:00
|
|
|
SetPppId();
|
1997-08-25 00:29:32 +00:00
|
|
|
return (NULL);
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
1997-08-25 00:29:32 +00:00
|
|
|
return (fp);
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1997-08-25 00:29:32 +00:00
|
|
|
CloseSecret(FILE * fp)
|
1995-01-31 06:29:58 +00:00
|
|
|
{
|
|
|
|
fclose(fp);
|
|
|
|
SetPppId();
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
1997-08-25 00:29:32 +00:00
|
|
|
SelectSystem(char *name, char *file)
|
1995-01-31 06:29:58 +00:00
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
char *cp, *wp;
|
|
|
|
int n;
|
1997-08-25 00:29:32 +00:00
|
|
|
u_char olauth;
|
1995-01-31 06:29:58 +00:00
|
|
|
char line[200];
|
1997-05-10 01:22:19 +00:00
|
|
|
char filename[200];
|
|
|
|
int linenum;
|
1995-01-31 06:29:58 +00:00
|
|
|
|
|
|
|
fp = NULL;
|
|
|
|
cp = getenv("HOME");
|
|
|
|
if (cp) {
|
|
|
|
SetUserId();
|
1997-05-10 01:22:19 +00:00
|
|
|
snprintf(filename, sizeof filename, "%s/.%s", cp, file);
|
|
|
|
fp = fopen(filename, "r");
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
|
|
|
if (fp == NULL) {
|
1997-08-25 00:29:32 +00:00
|
|
|
SetPppId(); /* fix from pdp@ark.jr3uom.iijnet.or.jp */
|
1997-05-10 01:22:19 +00:00
|
|
|
snprintf(filename, sizeof filename, "%s/%s", _PATH_PPP, file);
|
|
|
|
fp = fopen(filename, "r");
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
|
|
|
if (fp == NULL) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogDEBUG, "SelectSystem: Can't open %s.\n", filename);
|
1995-01-31 06:29:58 +00:00
|
|
|
SetPppId();
|
1997-08-25 00:29:32 +00:00
|
|
|
return (-1);
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogDEBUG, "SelectSystem: Checking %s (%s).\n", name, filename);
|
1997-05-10 01:22:19 +00:00
|
|
|
|
|
|
|
linenum = 0;
|
1995-01-31 06:29:58 +00:00
|
|
|
while (fgets(line, sizeof(line), fp)) {
|
1997-05-10 01:22:19 +00:00
|
|
|
linenum++;
|
1995-01-31 06:29:58 +00:00
|
|
|
cp = line;
|
|
|
|
switch (*cp) {
|
1997-08-25 00:29:32 +00:00
|
|
|
case '#': /* comment */
|
1995-01-31 06:29:58 +00:00
|
|
|
break;
|
|
|
|
case ' ':
|
|
|
|
case '\t':
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
wp = strpbrk(cp, ":\n");
|
1997-05-10 01:22:19 +00:00
|
|
|
if (wp == NULL) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogWARN, "Bad rule in %s (line %d) - missing colon.\n",
|
1997-08-25 00:29:32 +00:00
|
|
|
filename, linenum);
|
|
|
|
ServerClose();
|
1997-05-10 01:22:19 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
1995-01-31 06:29:58 +00:00
|
|
|
*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;
|
1997-08-31 22:59:49 +00:00
|
|
|
LogPrintf(LogCOMMAND, "%s: %s\n", name, cp);
|
1995-01-31 06:29:58 +00:00
|
|
|
SetPppId();
|
1997-08-25 00:29:32 +00:00
|
|
|
olauth = VarLocalAuth;
|
1997-09-04 00:38:22 +00:00
|
|
|
if (VarLocalAuth == LOCAL_NO_AUTH)
|
|
|
|
VarLocalAuth = LOCAL_AUTH;
|
1995-01-31 06:29:58 +00:00
|
|
|
DecodeCommand(cp, strlen(cp), 0);
|
1997-08-25 00:29:32 +00:00
|
|
|
VarLocalAuth = olauth;
|
1995-01-31 06:29:58 +00:00
|
|
|
SetUserId();
|
|
|
|
} else if (*cp == '#') {
|
|
|
|
continue;
|
|
|
|
} else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
SetPppId();
|
1997-08-25 00:29:32 +00:00
|
|
|
return (0);
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
SetPppId();
|
1997-06-09 03:27:43 +00:00
|
|
|
return -1;
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
1997-08-25 00:29:32 +00:00
|
|
|
LoadCommand(struct cmdtab const * list, int argc, char **argv)
|
1995-01-31 06:29:58 +00:00
|
|
|
{
|
|
|
|
char *name;
|
|
|
|
|
|
|
|
if (argc > 0)
|
|
|
|
name = *argv;
|
|
|
|
else
|
|
|
|
name = "default";
|
|
|
|
|
|
|
|
if (SelectSystem(name, CONFFILE) < 0) {
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogWARN, "%s: not found.\n", name);
|
|
|
|
return -1;
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
1997-06-09 03:27:43 +00:00
|
|
|
return 0;
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
1997-08-25 00:29:32 +00:00
|
|
|
SaveCommand(struct cmdtab const * list, int argc, char **argv)
|
1995-01-31 06:29:58 +00:00
|
|
|
{
|
1997-06-09 03:27:43 +00:00
|
|
|
LogPrintf(LogWARN, "save command is not implemented (yet).\n");
|
|
|
|
return 1;
|
1995-01-31 06:29:58 +00:00
|
|
|
}
|