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