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$ 21 * 22 * TODO: 23 */ 24 #include "fsm.h" 25 #include "vars.h" 26 #include "ipcp.h" 27 #include "pathnames.h" 28 #include "vars.h" 29 30 extern void DecodeCommand(); 31 32 static int uid, gid; 33 static int euid, egid; 34 static int usermode; 35 36 void 37 GetUid() 38 { 39 uid = getuid(); 40 gid = getgid(); 41 euid = geteuid(); 42 egid = getegid(); 43 usermode = 0; 44 } 45 46 static void 47 SetUserId() 48 { 49 if (!usermode) { 50 setreuid(euid, uid); 51 setregid(egid, gid); 52 usermode = 1; 53 } 54 } 55 56 static void 57 SetPppId() 58 { 59 if (usermode) { 60 setreuid(uid, euid); 61 setregid(gid, egid); 62 usermode = 0; 63 } 64 } 65 66 FILE * 67 OpenSecret(file) 68 char *file; 69 { 70 FILE *fp; 71 char *cp; 72 char line[100]; 73 74 fp = NULL; 75 cp = getenv("HOME"); 76 if (cp) { 77 SetUserId(); 78 snprintf(line, sizeof line, "%s/.%s", cp, file); 79 fp = fopen(line, "r"); 80 } 81 if (fp == NULL) { 82 SetPppId(); 83 snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file); 84 fp = fopen(line, "r"); 85 } 86 if (fp == NULL) { 87 fprintf(stderr, "can't open %s.\n", line); 88 SetPppId(); 89 return(NULL); 90 } 91 return(fp); 92 } 93 94 void 95 CloseSecret(fp) 96 FILE *fp; 97 { 98 fclose(fp); 99 SetPppId(); 100 } 101 102 int 103 SelectSystem(name, file) 104 char *name; 105 char *file; 106 { 107 FILE *fp; 108 char *cp, *wp; 109 int n; 110 int val = -1; 111 u_char olauth; 112 char line[200]; 113 114 fp = NULL; 115 cp = getenv("HOME"); 116 if (cp) { 117 SetUserId(); 118 snprintf(line, sizeof line, "%s/.%s", cp, file); 119 fp = fopen(line, "r"); 120 } 121 if (fp == NULL) { 122 SetPppId(); /* fix from pdp@ark.jr3uom.iijnet.or.jp */ 123 snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file); 124 fp = fopen(line, "r"); 125 } 126 if (fp == NULL) { 127 #ifdef DEBUG 128 fprintf(stderr, "can't open %s.\n", line); 129 #endif 130 SetPppId(); 131 return(-1); 132 } 133 #ifdef DEBUG 134 fprintf(stderr, "checking %s (%s).\n", name, line); 135 #endif 136 while (fgets(line, sizeof(line), fp)) { 137 cp = line; 138 switch (*cp) { 139 case '#': /* comment */ 140 break; 141 case ' ': 142 case '\t': 143 break; 144 default: 145 wp = strpbrk(cp, ":\n"); 146 *wp = '\0'; 147 if (strcmp(cp, name) == 0) { 148 while (fgets(line, sizeof(line), fp)) { 149 cp = line; 150 if (*cp == ' ' || *cp == '\t') { 151 n = strspn(cp, " \t"); 152 cp += n; 153 #ifdef DEBUG 154 fprintf(stderr, "%s", cp); 155 #endif 156 SetPppId(); 157 olauth = VarLocalAuth; 158 VarLocalAuth = LOCAL_AUTH; 159 DecodeCommand(cp, strlen(cp), 0); 160 VarLocalAuth = olauth; 161 SetUserId(); 162 } else if (*cp == '#') { 163 continue; 164 } else 165 break; 166 } 167 fclose(fp); 168 SetPppId(); 169 return(0); 170 } 171 break; 172 } 173 } 174 fclose(fp); 175 SetPppId(); 176 return(val); 177 } 178 179 int 180 LoadCommand(list, argc, argv) 181 struct cmdtab *list; 182 int argc; 183 char **argv; 184 { 185 char *name; 186 187 if (argc > 0) 188 name = *argv; 189 else 190 name = "default"; 191 192 if (SelectSystem(name, CONFFILE) < 0) { 193 printf("%s: not found.\n", name); 194 return(-1); 195 } 196 return(1); 197 } 198 199 extern struct in_addr ifnetmask; 200 201 int 202 SaveCommand(list, argc, argv) 203 struct cmdtab *list; 204 int argc; 205 char **argv; 206 { 207 printf("save command is not implemented (yet).\n"); 208 return(1); 209 } 210