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