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