systems.c revision 26940
1/*
2 *	          System configuration routines
3 *
4 *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5 *
6 *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
7 *
8 * Redistribution and use in source and binary forms are permitted
9 * provided that the above copyright notice and this paragraph are
10 * duplicated in all such forms and that any documentation,
11 * advertising materials, and other materials related to such
12 * distribution and use acknowledge that the software was developed
13 * by the Internet Initiative Japan, Inc.  The name of the
14 * IIJ may not be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 *
20 * $Id: systems.c,v 1.12 1997/06/09 03:27:38 brian Exp $
21 *
22 *  TODO:
23 */
24#include "fsm.h"
25#include "loadalias.h"
26#include "vars.h"
27#include "ipcp.h"
28#include "pathnames.h"
29#include "vars.h"
30#include "server.h"
31
32extern void DecodeCommand();
33
34static int uid, gid;
35static int euid, egid;
36static int usermode;
37
38int
39OrigUid()
40{
41    return uid;
42}
43
44void
45GetUid()
46{
47  uid = getuid();
48  gid = getgid();
49  euid = geteuid();
50  egid = getegid();
51  usermode = 0;
52}
53
54static void
55SetUserId()
56{
57  if (!usermode) {
58    if (setreuid(euid, uid) == -1) {
59      LogPrintf(LogERROR, "unable to setreuid!\n");
60      ServerClose();
61      exit(1);
62    }
63    if (setregid(egid, gid) == -1) {
64      LogPrintf(LogERROR, "unable to setregid!\n");
65      ServerClose();
66      exit(1);
67    }
68    usermode = 1;
69  }
70}
71
72static void
73SetPppId()
74{
75  if (usermode) {
76    if (setreuid(uid, euid) == -1) {
77      LogPrintf(LogERROR, "unable to setreuid!\n");
78      ServerClose();
79      exit(1);
80    }
81    if (setregid(gid, egid) == -1) {
82      LogPrintf(LogERROR, "unable to setregid!\n");
83      ServerClose();
84      exit(1);
85    }
86    usermode = 0;
87  }
88}
89
90FILE *
91OpenSecret(file)
92char *file;
93{
94  FILE *fp;
95  char *cp;
96  char line[100];
97
98  fp = NULL;
99  cp = getenv("HOME");
100  if (cp) {
101    SetUserId();
102    snprintf(line, sizeof line, "%s/.%s", cp, file);
103    fp = fopen(line, "r");
104  }
105  if (fp == NULL) {
106    SetPppId();
107    snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file);
108    fp = fopen(line, "r");
109  }
110  if (fp == NULL) {
111    LogPrintf(LogWARN, "OpenSecret: Can't open %s.\n", line);
112    SetPppId();
113    return(NULL);
114  }
115  return(fp);
116}
117
118void
119CloseSecret(fp)
120FILE *fp;
121{
122  fclose(fp);
123  SetPppId();
124}
125
126int
127SelectSystem(name, file)
128char *name;
129char *file;
130{
131  FILE *fp;
132  char *cp, *wp;
133  int n;
134  u_char  olauth;
135  char line[200];
136  char filename[200];
137  int linenum;
138
139  fp = NULL;
140  cp = getenv("HOME");
141  if (cp) {
142    SetUserId();
143    snprintf(filename, sizeof filename, "%s/.%s", cp, file);
144    fp = fopen(filename, "r");
145  }
146  if (fp == NULL) {
147    SetPppId();		/* fix from pdp@ark.jr3uom.iijnet.or.jp */
148    snprintf(filename, sizeof filename, "%s/%s", _PATH_PPP, file);
149    fp = fopen(filename, "r");
150  }
151  if (fp == NULL) {
152    LogPrintf(LogDEBUG, "SelectSystem: Can't open %s.\n", filename);
153    SetPppId();
154    return(-1);
155  }
156  LogPrintf(LogDEBUG, "SelectSystem: Checking %s (%s).\n", name, filename);
157
158  linenum = 0;
159  while (fgets(line, sizeof(line), fp)) {
160    linenum++;
161    cp = line;
162    switch (*cp) {
163    case '#':		/* comment */
164      break;
165    case ' ':
166    case '\t':
167      break;
168    default:
169      wp = strpbrk(cp, ":\n");
170      if (wp == NULL) {
171	LogPrintf(LogWARN, "Bad rule in %s (line %d) - missing colon.\n",
172		filename, linenum);
173        ServerClose();
174	exit(1);
175      }
176      *wp = '\0';
177      if (strcmp(cp, name) == 0) {
178	while (fgets(line, sizeof(line), fp)) {
179	  cp = line;
180	  if (*cp == ' ' || *cp == '\t') {
181	    n = strspn(cp, " \t");
182	    cp += n;
183	    LogPrintf(LogCOMMAND, "%s: %s", name, cp);
184	    SetPppId();
185            olauth = VarLocalAuth;
186	    VarLocalAuth = LOCAL_AUTH;
187	    DecodeCommand(cp, strlen(cp), 0);
188            VarLocalAuth = olauth;
189	    SetUserId();
190	  } else if (*cp == '#') {
191	    continue;
192	  } else
193	    break;
194	}
195	fclose(fp);
196	SetPppId();
197	return(0);
198      }
199      break;
200    }
201  }
202  fclose(fp);
203  SetPppId();
204  return -1;
205}
206
207int
208LoadCommand(list, argc, argv)
209struct cmdtab *list;
210int argc;
211char **argv;
212{
213  char *name;
214
215  if (argc > 0)
216    name = *argv;
217  else
218    name = "default";
219
220  if (SelectSystem(name, CONFFILE) < 0) {
221    LogPrintf(LogWARN, "%s: not found.\n", name);
222    return -1;
223  }
224
225  return 0;
226}
227
228int
229SaveCommand(list, argc, argv)
230struct cmdtab *list;
231int argc;
232char **argv;
233{
234  LogPrintf(LogWARN, "save command is not implemented (yet).\n");
235  return 1;
236}
237