systems.c revision 28679
1200581Srdivacky/*
2200581Srdivacky *	          System configuration routines
3200581Srdivacky *
4200581Srdivacky *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5200581Srdivacky *
6200581Srdivacky *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
7200581Srdivacky *
8200581Srdivacky * Redistribution and use in source and binary forms are permitted
9200581Srdivacky * provided that the above copyright notice and this paragraph are
10200581Srdivacky * duplicated in all such forms and that any documentation,
11200581Srdivacky * advertising materials, and other materials related to such
12200581Srdivacky * distribution and use acknowledge that the software was developed
13200581Srdivacky * by the Internet Initiative Japan, Inc.  The name of the
14200581Srdivacky * IIJ may not be used to endorse or promote products derived
15200581Srdivacky * from this software without specific prior written permission.
16200581Srdivacky * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17200581Srdivacky * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18249423Sdim * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19200581Srdivacky *
20200581Srdivacky * $Id: systems.c,v 1.13 1997/06/25 19:30:05 brian Exp $
21280031Sdim *
22200581Srdivacky *  TODO:
23243830Sdim */
24234353Sdim#include "fsm.h"
25234353Sdim#include "loadalias.h"
26200581Srdivacky#include "vars.h"
27200581Srdivacky#include "ipcp.h"
28200581Srdivacky#include "pathnames.h"
29200581Srdivacky#include "vars.h"
30200581Srdivacky#include "server.h"
31200581Srdivacky#include "command.h"
32200581Srdivacky
33200581Srdivackyextern void DecodeCommand();
34200581Srdivacky
35200581Srdivackystatic int uid, gid;
36200581Srdivackystatic int euid, egid;
37200581Srdivackystatic int usermode;
38200581Srdivacky
39234353Sdimint
40288943SdimOrigUid()
41288943Sdim{
42288943Sdim  return uid;
43234353Sdim}
44234353Sdim
45280031Sdimvoid
46280031SdimGetUid()
47280031Sdim{
48280031Sdim  uid = getuid();
49200581Srdivacky  gid = getgid();
50200581Srdivacky  euid = geteuid();
51200581Srdivacky  egid = getegid();
52288943Sdim  usermode = 0;
53280031Sdim}
54200581Srdivacky
55200581Srdivackystatic void
56200581SrdivackySetUserId()
57200581Srdivacky{
58200581Srdivacky  if (!usermode) {
59200581Srdivacky    if (setreuid(euid, uid) == -1) {
60200581Srdivacky      LogPrintf(LogERROR, "unable to setreuid!\n");
61200581Srdivacky      ServerClose();
62200581Srdivacky      exit(1);
63200581Srdivacky    }
64200581Srdivacky    if (setregid(egid, gid) == -1) {
65200581Srdivacky      LogPrintf(LogERROR, "unable to setregid!\n");
66200581Srdivacky      ServerClose();
67200581Srdivacky      exit(1);
68200581Srdivacky    }
69200581Srdivacky    usermode = 1;
70200581Srdivacky  }
71200581Srdivacky}
72200581Srdivacky
73200581Srdivackystatic void
74200581SrdivackySetPppId()
75200581Srdivacky{
76200581Srdivacky  if (usermode) {
77200581Srdivacky    if (setreuid(uid, euid) == -1) {
78288943Sdim      LogPrintf(LogERROR, "unable to setreuid!\n");
79288943Sdim      ServerClose();
80204642Srdivacky      exit(1);
81204642Srdivacky    }
82288943Sdim    if (setregid(gid, egid) == -1) {
83288943Sdim      LogPrintf(LogERROR, "unable to setregid!\n");
84200581Srdivacky      ServerClose();
85200581Srdivacky      exit(1);
86200581Srdivacky    }
87200581Srdivacky    usermode = 0;
88200581Srdivacky  }
89200581Srdivacky}
90200581Srdivacky
91200581SrdivackyFILE *
92200581SrdivackyOpenSecret(char *file)
93200581Srdivacky{
94200581Srdivacky  FILE *fp;
95200581Srdivacky  char *cp;
96200581Srdivacky  char line[100];
97200581Srdivacky
98200581Srdivacky  fp = NULL;
99200581Srdivacky  cp = getenv("HOME");
100200581Srdivacky  if (cp) {
101200581Srdivacky    SetUserId();
102204642Srdivacky    snprintf(line, sizeof line, "%s/.%s", cp, file);
103204642Srdivacky    fp = fopen(line, "r");
104200581Srdivacky  }
105200581Srdivacky  if (fp == NULL) {
106200581Srdivacky    SetPppId();
107200581Srdivacky    snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file);
108200581Srdivacky    fp = fopen(line, "r");
109200581Srdivacky  }
110200581Srdivacky  if (fp == NULL) {
111200581Srdivacky    LogPrintf(LogWARN, "OpenSecret: Can't open %s.\n", line);
112200581Srdivacky    SetPppId();
113200581Srdivacky    return (NULL);
114200581Srdivacky  }
115200581Srdivacky  return (fp);
116200581Srdivacky}
117200581Srdivacky
118200581Srdivackyvoid
119200581SrdivackyCloseSecret(FILE * fp)
120200581Srdivacky{
121200581Srdivacky  fclose(fp);
122200581Srdivacky  SetPppId();
123200581Srdivacky}
124200581Srdivacky
125200581Srdivackyint
126200581SrdivackySelectSystem(char *name, char *file)
127{
128  FILE *fp;
129  char *cp, *wp;
130  int n;
131  u_char olauth;
132  char line[200];
133  char filename[200];
134  int linenum;
135
136  fp = NULL;
137  cp = getenv("HOME");
138  if (cp) {
139    SetUserId();
140    snprintf(filename, sizeof filename, "%s/.%s", cp, file);
141    fp = fopen(filename, "r");
142  }
143  if (fp == NULL) {
144    SetPppId();			/* fix from pdp@ark.jr3uom.iijnet.or.jp */
145    snprintf(filename, sizeof filename, "%s/%s", _PATH_PPP, file);
146    fp = fopen(filename, "r");
147  }
148  if (fp == NULL) {
149    LogPrintf(LogDEBUG, "SelectSystem: Can't open %s.\n", filename);
150    SetPppId();
151    return (-1);
152  }
153  LogPrintf(LogDEBUG, "SelectSystem: Checking %s (%s).\n", name, filename);
154
155  linenum = 0;
156  while (fgets(line, sizeof(line), fp)) {
157    linenum++;
158    cp = line;
159    switch (*cp) {
160    case '#':			/* comment */
161      break;
162    case ' ':
163    case '\t':
164      break;
165    default:
166      wp = strpbrk(cp, ":\n");
167      if (wp == NULL) {
168	LogPrintf(LogWARN, "Bad rule in %s (line %d) - missing colon.\n",
169		  filename, linenum);
170	ServerClose();
171	exit(1);
172      }
173      *wp = '\0';
174      if (strcmp(cp, name) == 0) {
175	while (fgets(line, sizeof(line), fp)) {
176	  cp = line;
177	  if (*cp == ' ' || *cp == '\t') {
178	    n = strspn(cp, " \t");
179	    cp += n;
180	    LogPrintf(LogCOMMAND, "%s: %s", name, cp);
181	    SetPppId();
182	    olauth = VarLocalAuth;
183	    VarLocalAuth = LOCAL_AUTH;
184	    DecodeCommand(cp, strlen(cp), 0);
185	    VarLocalAuth = olauth;
186	    SetUserId();
187	  } else if (*cp == '#') {
188	    continue;
189	  } else
190	    break;
191	}
192	fclose(fp);
193	SetPppId();
194	return (0);
195      }
196      break;
197    }
198  }
199  fclose(fp);
200  SetPppId();
201  return -1;
202}
203
204int
205LoadCommand(struct cmdtab const * list, int argc, char **argv)
206{
207  char *name;
208
209  if (argc > 0)
210    name = *argv;
211  else
212    name = "default";
213
214  if (SelectSystem(name, CONFFILE) < 0) {
215    LogPrintf(LogWARN, "%s: not found.\n", name);
216    return -1;
217  }
218  return 0;
219}
220
221int
222SaveCommand(struct cmdtab const * list, int argc, char **argv)
223{
224  LogPrintf(LogWARN, "save command is not implemented (yet).\n");
225  return 1;
226}
227