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 * $Id: id.c,v 1.10 1998/05/29 18:33:08 brian Exp $ 27 */ 28 29 #include <sys/types.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 #include <unistd.h> 41 #ifdef __OpenBSD__ 42 #include <util.h> 43 #else 44 #include <libutil.h> 45 #endif 46 #include <utmp.h> 47 48 #include "log.h" 49 #include "main.h" 50 #include "id.h" 51 52 static int uid; 53 static int euid; 54 55 void 56 ID0init() 57 { 58 uid = getuid(); 59 euid = geteuid(); 60 } 61 62 static void 63 ID0setuser(void) 64 { 65 if (seteuid(uid) == -1) { 66 log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 67 AbortProgram(EX_NOPERM); 68 } 69 } 70 71 uid_t 72 ID0realuid() 73 { 74 return uid; 75 } 76 77 static void 78 ID0set0(void) 79 { 80 if (seteuid(euid) == -1) { 81 log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n"); 82 AbortProgram(EX_NOPERM); 83 } 84 } 85 86 int 87 ID0ioctl(int fd, unsigned long req, void *arg) 88 { 89 int ret; 90 91 ID0set0(); 92 ret = ioctl(fd, req, arg); 93 log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg); 94 ID0setuser(); 95 return ret; 96 } 97 98 int 99 ID0unlink(const char *name) 100 { 101 int ret; 102 103 ID0set0(); 104 ret = unlink(name); 105 log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name); 106 ID0setuser(); 107 return ret; 108 } 109 110 int 111 ID0socket(int domain, int type, int protocol) 112 { 113 int ret; 114 115 ID0set0(); 116 ret = socket(domain, type, protocol); 117 log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol); 118 ID0setuser(); 119 return ret; 120 } 121 122 FILE * 123 ID0fopen(const char *path, const char *mode) 124 { 125 FILE *ret; 126 127 ID0set0(); 128 ret = fopen(path, mode); 129 log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode); 130 ID0setuser(); 131 return ret; 132 } 133 134 int 135 ID0open(const char *path, int flags, ...) 136 { 137 int ret; 138 va_list ap; 139 140 va_start(ap, flags); 141 ID0set0(); 142 ret = open(path, flags, va_arg(ap, int)); 143 log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags); 144 ID0setuser(); 145 va_end(ap); 146 return ret; 147 } 148 149 int 150 ID0write(int fd, const void *data, size_t len) 151 { 152 int ret; 153 154 ID0set0(); 155 ret = write(fd, data, len); 156 log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len); 157 ID0setuser(); 158 return ret; 159 } 160 161 int 162 ID0uu_lock(const char *basettyname) 163 { 164 int ret; 165 166 ID0set0(); 167 ret = uu_lock(basettyname); 168 log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname); 169 ID0setuser(); 170 return ret; 171 } 172 173 int 174 ID0uu_lock_txfr(const char *basettyname, pid_t newpid) 175 { 176 int ret; 177 178 ID0set0(); 179 ret = uu_lock_txfr(basettyname, newpid); 180 log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %d)\n", ret, basettyname, 181 (int)newpid); 182 ID0setuser(); 183 return ret; 184 } 185 186 int 187 ID0uu_unlock(const char *basettyname) 188 { 189 int ret; 190 191 ID0set0(); 192 ret = uu_unlock(basettyname); 193 log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname); 194 ID0setuser(); 195 return ret; 196 } 197 198 void 199 ID0login(struct utmp *ut) 200 { 201 ID0set0(); 202 if (logout(ut->ut_line)) { 203 log_Printf(LogID0, "logout(\"%s\")\n", ut->ut_line); 204 logwtmp(ut->ut_line, "", ""); 205 log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut->ut_line); 206 } 207 login(ut); 208 log_Printf(LogID0, "login(\"%s\", \"%.*s\")\n", 209 ut->ut_line, (int)(sizeof ut->ut_name), ut->ut_name); 210 ID0setuser(); 211 } 212 213 void 214 ID0logout(const char *device) 215 { 216 struct utmp ut; 217 218 strncpy(ut.ut_line, device, sizeof ut.ut_line - 1); 219 ut.ut_line[sizeof ut.ut_line - 1] = '\0'; 220 221 ID0set0(); 222 if (logout(ut.ut_line)) { 223 log_Printf(LogID0, "logout(\"%s\")\n", ut.ut_line); 224 logwtmp(ut.ut_line, "", ""); 225 log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut.ut_line); 226 } else 227 log_Printf(LogERROR, "ID0logout: No longer logged in on %s\n", ut.ut_line); 228 ID0setuser(); 229 } 230 231 int 232 ID0bind_un(int s, const struct sockaddr_un *name) 233 { 234 int result; 235 236 ID0set0(); 237 result = bind(s, (const struct sockaddr *)name, sizeof *name); 238 log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n", 239 result, s, name->sun_path, (int)sizeof(*name)); 240 ID0setuser(); 241 return result; 242 } 243 244 int 245 ID0connect_un(int s, const struct sockaddr_un *name) 246 { 247 int result; 248 249 ID0set0(); 250 result = connect(s, (const struct sockaddr *)name, sizeof *name); 251 log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n", 252 result, s, name->sun_path, (int)sizeof(*name)); 253 ID0setuser(); 254 return result; 255 } 256 257 int 258 ID0kill(pid_t pid, int sig) 259 { 260 int result; 261 262 ID0set0(); 263 result = kill(pid, sig); 264 log_Printf(LogID0, "%d = kill(%d, %d)\n", result, (int)pid, sig); 265 ID0setuser(); 266 return result; 267 } 268