systems.c revision 22997
174462Salfred/*
274462Salfred *	          System configuration routines
374462Salfred *
4261057Smav *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5261057Smav *
6261057Smav *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
78870Srgrimes *
8261057Smav * Redistribution and use in source and binary forms are permitted
9261057Smav * provided that the above copyright notice and this paragraph are
10261057Smav * duplicated in all such forms and that any documentation,
11261057Smav * advertising materials, and other materials related to such
12261057Smav * distribution and use acknowledge that the software was developed
13261057Smav * by the Internet Initiative Japan, Inc.  The name of the
14261057Smav * IIJ may not be used to endorse or promote products derived
15261057Smav * from this software without specific prior written permission.
16261057Smav * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17261057Smav * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18261057Smav * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19261057Smav *
20261057Smav * $Id$
21261057Smav *
22261057Smav *  TODO:
23261057Smav */
24261057Smav#include "fsm.h"
25261057Smav#include "vars.h"
26261057Smav#include "ipcp.h"
27261057Smav#include "pathnames.h"
28261057Smav#include "vars.h"
29261057Smav
301901Swollmanextern void DecodeCommand();
311901Swollman
321901Swollmanstatic int uid, gid;
33136581Sobrienstatic int euid, egid;
3474462Salfredstatic int usermode;
351901Swollman
3692990Sobrienvoid
3792990SobrienGetUid()
381901Swollman{
391901Swollman  uid = getuid();
401901Swollman  gid = getgid();
411901Swollman  euid = geteuid();
421901Swollman  egid = getegid();
431901Swollman  usermode = 0;
441901Swollman}
4574462Salfred
4674462Salfredstatic void
471901SwollmanSetUserId()
4811666Sphk{
491901Swollman  if (!usermode) {
5074462Salfred    setreuid(euid, uid);
511901Swollman    setregid(egid, gid);
521901Swollman    usermode = 1;
531901Swollman  }
541901Swollman}
5574462Salfred
561901Swollmanstatic void
5774462SalfredSetPppId()
5874462Salfred{
5992905Sobrien  if (usermode) {
6092905Sobrien    setreuid(uid, euid);
6121068Speter    setregid(gid, egid);
621901Swollman    usermode = 0;
631901Swollman  }
641901Swollman}
651901Swollman
661901SwollmanFILE *
671901SwollmanOpenSecret(file)
6821068Speterchar *file;
691901Swollman{
701901Swollman  FILE *fp;
711901Swollman  char *cp;
721901Swollman  char line[100];
731901Swollman
741901Swollman  fp = NULL;
751901Swollman  cp = getenv("HOME");
761901Swollman  if (cp) {
771901Swollman    SetUserId();
7874462Salfred    snprintf(line, sizeof line, "%s/.%s", cp, file);
791901Swollman    fp = fopen(line, "r");
801901Swollman  }
811901Swollman  if (fp == NULL) {
8274462Salfred    SetPppId();
8374462Salfred    snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file);
8474462Salfred    fp = fopen(line, "r");
851901Swollman  }
8674462Salfred  if (fp == NULL) {
8774462Salfred    fprintf(stderr, "can't open %s.\n", line);
8874462Salfred    SetPppId();
8974462Salfred    return(NULL);
901901Swollman  }
911901Swollman  return(fp);
9274462Salfred}
9374462Salfred
941901Swollmanvoid
951901SwollmanCloseSecret(fp)
9681966SbrianFILE *fp;
9781966Sbrian{
9881966Sbrian  fclose(fp);
9981966Sbrian  SetPppId();
1001901Swollman}
10174462Salfred
10274462Salfredint
10374462SalfredSelectSystem(name, file)
10474462Salfredchar *name;
10574462Salfredchar *file;
1061901Swollman{
1071901Swollman  FILE *fp;
1081901Swollman  char *cp, *wp;
1091901Swollman  int n;
1108870Srgrimes  int val = -1;
1111901Swollman  u_char  olauth;
1121901Swollman  char line[200];
1131901Swollman
1141901Swollman  fp = NULL;
1151901Swollman  cp = getenv("HOME");
1161901Swollman  if (cp) {
1171901Swollman    SetUserId();
1181901Swollman    snprintf(line, sizeof line, "%s/.%s", cp, file);
1191901Swollman    fp = fopen(line, "r");
1201901Swollman  }
1211901Swollman  if (fp == NULL) {
1221901Swollman    SetPppId();		/* fix from pdp@ark.jr3uom.iijnet.or.jp */
1231901Swollman    snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file);
12474462Salfred    fp = fopen(line, "r");
12581966Sbrian  }
12681966Sbrian  if (fp == NULL) {
12781966Sbrian#ifdef DEBUG
12881966Sbrian    fprintf(stderr, "can't open %s.\n", line);
1291901Swollman#endif
1301901Swollman    SetPppId();
1311901Swollman    return(-1);
13274462Salfred  }
13374462Salfred#ifdef DEBUG
13481966Sbrian  fprintf(stderr, "checking %s (%s).\n", name, line);
13581966Sbrian#endif
13681966Sbrian  while (fgets(line, sizeof(line), fp)) {
13781966Sbrian    cp = line;
1381901Swollman    switch (*cp) {
1391901Swollman    case '#':		/* comment */
1401901Swollman      break;
1411901Swollman    case ' ':
14274462Salfred    case '\t':
14381966Sbrian      break;
14481966Sbrian    default:
14581966Sbrian      wp = strpbrk(cp, ":\n");
14681966Sbrian      *wp = '\0';
1471901Swollman      if (strcmp(cp, name) == 0) {
14874462Salfred	while (fgets(line, sizeof(line), fp)) {
1491901Swollman	  cp = line;
15074462Salfred	  if (*cp == ' ' || *cp == '\t') {
15174462Salfred	    n = strspn(cp, " \t");
1521901Swollman	    cp += n;
1531901Swollman#ifdef DEBUG
15481966Sbrian	    fprintf(stderr, "%s", cp);
15581966Sbrian#endif
15681966Sbrian	    SetPppId();
15781966Sbrian            olauth = VarLocalAuth;
1581901Swollman	    VarLocalAuth = LOCAL_AUTH;
1591901Swollman	    DecodeCommand(cp, strlen(cp), 0);
1601901Swollman            VarLocalAuth = olauth;
16174462Salfred	    SetUserId();
16274462Salfred	  } else if (*cp == '#') {
16381966Sbrian	    continue;
16481966Sbrian	  } else
16581966Sbrian	    break;
16681966Sbrian	}
1671901Swollman	fclose(fp);
1681901Swollman	SetPppId();
1691901Swollman	return(0);
17074462Salfred      }
17174462Salfred      break;
17281966Sbrian    }
17381966Sbrian  }
17481966Sbrian  fclose(fp);
17581966Sbrian  SetPppId();
1761901Swollman  return(val);
1771901Swollman}
17821068Speter
1791901Swollmanint
1801901SwollmanLoadCommand(list, argc, argv)
1811901Swollmanstruct cmdtab *list;
1821901Swollmanint argc;
1831901Swollmanchar **argv;
1841901Swollman{
18574462Salfred  char *name;
1861901Swollman
18774462Salfred  if (argc > 0)
18874462Salfred    name = *argv;
18974462Salfred  else
19074462Salfred    name = "default";
19174462Salfred
1921901Swollman  if (SelectSystem(name, CONFFILE) < 0) {
1931901Swollman    printf("%s: not found.\n", name);
19421068Speter    return(-1);
19521068Speter  }
19621068Speter  return(1);
19721068Speter}
19821068Speter
19921068Speterextern struct in_addr ifnetmask;
20021068Speter
20121068Speterint
20221068SpeterSaveCommand(list, argc, argv)
20321068Speterstruct cmdtab *list;
20421068Speterint argc;
20521068Speterchar **argv;
20621068Speter{
20721068Speter  printf("save command is not implemented (yet).\n");
20821068Speter  return(1);
20921068Speter}
21021068Speter