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$ 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 55 static int uid; 56 static int euid; 57 58 void 59 ID0init() 60 { 61 uid = getuid(); 62 euid = geteuid(); 63 } 64 65 static void 66 ID0setuser(void) 67 { 68 if (seteuid(uid) == -1) { 69 log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 70 AbortProgram(EX_NOPERM); 71 } 72 } 73 74 uid_t 75 ID0realuid() 76 { 77 return uid; 78 } 79 80 static void 81 ID0set0(void) 82 { 83 if (seteuid(euid) == -1) { 84 log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n"); 85 AbortProgram(EX_NOPERM); 86 } 87 } 88 89 int 90 ID0ioctl(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 101 int 102 ID0unlink(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 113 int 114 ID0socket(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 125 FILE * 126 ID0fopen(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 137 int 138 ID0open(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 152 int 153 ID0write(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 164 int 165 ID0uu_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 176 int 177 ID0uu_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 189 int 190 ID0uu_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 201 void 202 ID0login(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 216 void 217 ID0logout(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 234 int 235 ID0bind_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 247 int 248 ID0connect_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 260 int 261 ID0kill(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 #ifdef KLDSYM_LOOKUP 273 int 274 ID0kldload(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