id.c revision 53241
1/*- 2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: head/usr.sbin/ppp/id.c 53241 1999-11-16 21:57:34Z brian $ 27 */ 28 29#include <sys/param.h> 30#include <sys/socket.h> 31#include <sys/un.h> 32 33#include <sys/ioctl.h> 34#include <fcntl.h> 35#include <signal.h> 36#include <stdarg.h> 37#include <stdio.h> 38#include <string.h> 39#include <sysexits.h> 40#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 41#include <sys/linker.h> 42#endif 43#include <unistd.h> 44#ifdef __OpenBSD__ 45#include <util.h> 46#else 47#include <libutil.h> 48#endif 49#include <utmp.h> 50 51#include "log.h" 52#include "main.h" 53#include "id.h" 54 55static int uid; 56static int euid; 57 58void 59ID0init() 60{ 61 uid = getuid(); 62 euid = geteuid(); 63} 64 65static void 66ID0setuser(void) 67{ 68 if (seteuid(uid) == -1) { 69 log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 70 AbortProgram(EX_NOPERM); 71 } 72} 73 74uid_t 75ID0realuid() 76{ 77 return uid; 78} 79 80static void 81ID0set0(void) 82{ 83 if (seteuid(euid) == -1) { 84 log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n"); 85 AbortProgram(EX_NOPERM); 86 } 87} 88 89int 90ID0ioctl(int fd, unsigned long req, void *arg) 91{ 92 int ret; 93 94 ID0set0(); 95 ret = ioctl(fd, req, arg); 96 log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg); 97 ID0setuser(); 98 return ret; 99} 100 101int 102ID0unlink(const char *name) 103{ 104 int ret; 105 106 ID0set0(); 107 ret = unlink(name); 108 log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name); 109 ID0setuser(); 110 return ret; 111} 112 113int 114ID0socket(int domain, int type, int protocol) 115{ 116 int ret; 117 118 ID0set0(); 119 ret = socket(domain, type, protocol); 120 log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol); 121 ID0setuser(); 122 return ret; 123} 124 125FILE * 126ID0fopen(const char *path, const char *mode) 127{ 128 FILE *ret; 129 130 ID0set0(); 131 ret = fopen(path, mode); 132 log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode); 133 ID0setuser(); 134 return ret; 135} 136 137int 138ID0open(const char *path, int flags, ...) 139{ 140 int ret; 141 va_list ap; 142 143 va_start(ap, flags); 144 ID0set0(); 145 ret = open(path, flags, va_arg(ap, int)); 146 log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags); 147 ID0setuser(); 148 va_end(ap); 149 return ret; 150} 151 152int 153ID0write(int fd, const void *data, size_t len) 154{ 155 int ret; 156 157 ID0set0(); 158 ret = write(fd, data, len); 159 log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len); 160 ID0setuser(); 161 return ret; 162} 163 164int 165ID0uu_lock(const char *basettyname) 166{ 167 int ret; 168 169 ID0set0(); 170 ret = uu_lock(basettyname); 171 log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname); 172 ID0setuser(); 173 return ret; 174} 175 176int 177ID0uu_lock_txfr(const char *basettyname, pid_t newpid) 178{ 179 int ret; 180 181 ID0set0(); 182 ret = uu_lock_txfr(basettyname, newpid); 183 log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %d)\n", ret, basettyname, 184 (int)newpid); 185 ID0setuser(); 186 return ret; 187} 188 189int 190ID0uu_unlock(const char *basettyname) 191{ 192 int ret; 193 194 ID0set0(); 195 ret = uu_unlock(basettyname); 196 log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname); 197 ID0setuser(); 198 return ret; 199} 200 201void 202ID0login(struct utmp *ut) 203{ 204 ID0set0(); 205 if (logout(ut->ut_line)) { 206 log_Printf(LogID0, "logout(\"%s\")\n", ut->ut_line); 207 logwtmp(ut->ut_line, "", ""); 208 log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut->ut_line); 209 } 210 login(ut); 211 log_Printf(LogID0, "login(\"%s\", \"%.*s\")\n", 212 ut->ut_line, (int)(sizeof ut->ut_name), ut->ut_name); 213 ID0setuser(); 214} 215 216void 217ID0logout(const char *device, int nologout) 218{ 219 struct utmp ut; 220 221 strncpy(ut.ut_line, device, sizeof ut.ut_line - 1); 222 ut.ut_line[sizeof ut.ut_line - 1] = '\0'; 223 224 ID0set0(); 225 if (nologout || logout(ut.ut_line)) { 226 log_Printf(LogID0, "logout(\"%s\")\n", ut.ut_line); 227 logwtmp(ut.ut_line, "", ""); 228 log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut.ut_line); 229 } else 230 log_Printf(LogERROR, "ID0logout: No longer logged in on %s\n", ut.ut_line); 231 ID0setuser(); 232} 233 234int 235ID0bind_un(int s, const struct sockaddr_un *name) 236{ 237 int result; 238 239 ID0set0(); 240 result = bind(s, (const struct sockaddr *)name, sizeof *name); 241 log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n", 242 result, s, name->sun_path, (int)sizeof(*name)); 243 ID0setuser(); 244 return result; 245} 246 247int 248ID0connect_un(int s, const struct sockaddr_un *name) 249{ 250 int result; 251 252 ID0set0(); 253 result = connect(s, (const struct sockaddr *)name, sizeof *name); 254 log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n", 255 result, s, name->sun_path, (int)sizeof(*name)); 256 ID0setuser(); 257 return result; 258} 259 260int 261ID0kill(pid_t pid, int sig) 262{ 263 int result; 264 265 ID0set0(); 266 result = kill(pid, sig); 267 log_Printf(LogID0, "%d = kill(%d, %d)\n", result, (int)pid, sig); 268 ID0setuser(); 269 return result; 270} 271 272#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 273int 274ID0kldload(const char *dev) 275{ 276 int result; 277 278 ID0set0(); 279 result = kldload(dev); 280 log_Printf(LogID0, "%d = kldload(\"%s\")\n", result, dev); 281 ID0setuser(); 282 return result; 283} 284#endif 285