1c39934eaSBrian Somers /*- 21de7b4b8SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 31de7b4b8SPedro F. Giffuni * 4c39934eaSBrian Somers * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 5c39934eaSBrian Somers * All rights reserved. 6c39934eaSBrian Somers * 7c39934eaSBrian Somers * Redistribution and use in source and binary forms, with or without 8c39934eaSBrian Somers * modification, are permitted provided that the following conditions 9c39934eaSBrian Somers * are met: 10c39934eaSBrian Somers * 1. Redistributions of source code must retain the above copyright 11c39934eaSBrian Somers * notice, this list of conditions and the following disclaimer. 12c39934eaSBrian Somers * 2. Redistributions in binary form must reproduce the above copyright 13c39934eaSBrian Somers * notice, this list of conditions and the following disclaimer in the 14c39934eaSBrian Somers * documentation and/or other materials provided with the distribution. 15c39934eaSBrian Somers * 16c39934eaSBrian Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17c39934eaSBrian Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18c39934eaSBrian Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19c39934eaSBrian Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20c39934eaSBrian Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21c39934eaSBrian Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22c39934eaSBrian Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23c39934eaSBrian Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24c39934eaSBrian Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25c39934eaSBrian Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26c39934eaSBrian Somers * SUCH DAMAGE. 27c39934eaSBrian Somers * 2897d92980SPeter Wemm * $FreeBSD$ 295106c671SBrian Somers */ 305106c671SBrian Somers 31fc3034caSBrian Somers #include <sys/param.h> 325106c671SBrian Somers #include <sys/socket.h> 331fa665f5SBrian Somers #include <sys/un.h> 345106c671SBrian Somers 355106c671SBrian Somers #include <sys/ioctl.h> 365106c671SBrian Somers #include <fcntl.h> 3731dd45c4SBrian Somers #ifndef NONETGRAPH 3831dd45c4SBrian Somers #include <netgraph.h> 3931dd45c4SBrian Somers #endif 408e7b8599SBrian Somers #include <signal.h> 413edeb0c6SBrian Somers #include <stdarg.h> 425106c671SBrian Somers #include <stdio.h> 4345ad566fSBrian Somers #include <string.h> 445106c671SBrian Somers #include <sysexits.h> 45fc3034caSBrian Somers #if defined(__FreeBSD__) && !defined(NOKLDLOAD) 46fc3034caSBrian Somers #include <sys/linker.h> 47fc3034caSBrian Somers #endif 485106c671SBrian Somers #include <unistd.h> 495106c671SBrian Somers #ifdef __OpenBSD__ 505106c671SBrian Somers #include <util.h> 515106c671SBrian Somers #else 525106c671SBrian Somers #include <libutil.h> 535106c671SBrian Somers #endif 54adc17f0aSEd Schouten #include <utmpx.h> 5545ad566fSBrian Somers 5645ad566fSBrian Somers #include "log.h" 5745ad566fSBrian Somers #include "main.h" 585106c671SBrian Somers #include "id.h" 595106c671SBrian Somers 605106c671SBrian Somers static int uid; 615106c671SBrian Somers static int euid; 625106c671SBrian Somers 635106c671SBrian Somers void 64*672eba24SJohn Baldwin ID0init(void) 655106c671SBrian Somers { 665106c671SBrian Somers uid = getuid(); 675106c671SBrian Somers euid = geteuid(); 685106c671SBrian Somers } 695106c671SBrian Somers 705106c671SBrian Somers static void 71b6e82f33SBrian Somers ID0setuser(void) 725106c671SBrian Somers { 739fecb4e6SBrian Somers if (seteuid(uid) == -1) { 74dd7e2610SBrian Somers log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 751afedc4bSBrian Somers AbortProgram(EX_NOPERM); 765106c671SBrian Somers } 775106c671SBrian Somers } 785106c671SBrian Somers 795106c671SBrian Somers uid_t 80*672eba24SJohn Baldwin ID0realuid(void) 815106c671SBrian Somers { 825106c671SBrian Somers return uid; 835106c671SBrian Somers } 845106c671SBrian Somers 855106c671SBrian Somers static void 86b6e82f33SBrian Somers ID0set0(void) 875106c671SBrian Somers { 889fecb4e6SBrian Somers if (seteuid(euid) == -1) { 89dd7e2610SBrian Somers log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n"); 901afedc4bSBrian Somers AbortProgram(EX_NOPERM); 915106c671SBrian Somers } 925106c671SBrian Somers } 935106c671SBrian Somers 945106c671SBrian Somers int 955106c671SBrian Somers ID0ioctl(int fd, unsigned long req, void *arg) 965106c671SBrian Somers { 975106c671SBrian Somers int ret; 985106c671SBrian Somers 995106c671SBrian Somers ID0set0(); 1005106c671SBrian Somers ret = ioctl(fd, req, arg); 101dd7e2610SBrian Somers log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg); 1025106c671SBrian Somers ID0setuser(); 1035106c671SBrian Somers return ret; 1045106c671SBrian Somers } 1055106c671SBrian Somers 1065106c671SBrian Somers int 1075106c671SBrian Somers ID0unlink(const char *name) 1085106c671SBrian Somers { 1095106c671SBrian Somers int ret; 1105106c671SBrian Somers 1115106c671SBrian Somers ID0set0(); 1125106c671SBrian Somers ret = unlink(name); 113dd7e2610SBrian Somers log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name); 1145106c671SBrian Somers ID0setuser(); 1155106c671SBrian Somers return ret; 1165106c671SBrian Somers } 1175106c671SBrian Somers 1185106c671SBrian Somers int 1195106c671SBrian Somers ID0socket(int domain, int type, int protocol) 1205106c671SBrian Somers { 1215106c671SBrian Somers int ret; 1225106c671SBrian Somers 1235106c671SBrian Somers ID0set0(); 1245106c671SBrian Somers ret = socket(domain, type, protocol); 125dd7e2610SBrian Somers log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol); 1265106c671SBrian Somers ID0setuser(); 1275106c671SBrian Somers return ret; 1285106c671SBrian Somers } 1295106c671SBrian Somers 1305106c671SBrian Somers FILE * 1315106c671SBrian Somers ID0fopen(const char *path, const char *mode) 1325106c671SBrian Somers { 1335106c671SBrian Somers FILE *ret; 1345106c671SBrian Somers 1355106c671SBrian Somers ID0set0(); 1365106c671SBrian Somers ret = fopen(path, mode); 137dd7e2610SBrian Somers log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode); 1385106c671SBrian Somers ID0setuser(); 1395106c671SBrian Somers return ret; 1405106c671SBrian Somers } 1415106c671SBrian Somers 1425106c671SBrian Somers int 1433edeb0c6SBrian Somers ID0open(const char *path, int flags, ...) 1445106c671SBrian Somers { 1455106c671SBrian Somers int ret; 1463edeb0c6SBrian Somers va_list ap; 1475106c671SBrian Somers 1483edeb0c6SBrian Somers va_start(ap, flags); 1495106c671SBrian Somers ID0set0(); 1503edeb0c6SBrian Somers ret = open(path, flags, va_arg(ap, int)); 151dd7e2610SBrian Somers log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags); 1525106c671SBrian Somers ID0setuser(); 1533edeb0c6SBrian Somers va_end(ap); 1545106c671SBrian Somers return ret; 1555106c671SBrian Somers } 1565106c671SBrian Somers 1575106c671SBrian Somers int 158de7453bbSBrian Somers ID0write(int fd, const void *data, size_t len) 159de7453bbSBrian Somers { 160de7453bbSBrian Somers int ret; 161de7453bbSBrian Somers 162de7453bbSBrian Somers ID0set0(); 163de7453bbSBrian Somers ret = write(fd, data, len); 1643a2e4f62SBrian Somers log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len); 165de7453bbSBrian Somers ID0setuser(); 166de7453bbSBrian Somers return ret; 167de7453bbSBrian Somers } 168de7453bbSBrian Somers 169de7453bbSBrian Somers int 170b6e82f33SBrian Somers ID0uu_lock(const char *basettyname) 1715106c671SBrian Somers { 1725106c671SBrian Somers int ret; 1735106c671SBrian Somers 1745106c671SBrian Somers ID0set0(); 175b6e82f33SBrian Somers ret = uu_lock(basettyname); 176dd7e2610SBrian Somers log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname); 1775106c671SBrian Somers ID0setuser(); 1785106c671SBrian Somers return ret; 1795106c671SBrian Somers } 1805106c671SBrian Somers 1815106c671SBrian Somers int 18285fd273aSBrian Somers ID0uu_lock_txfr(const char *basettyname, pid_t newpid) 18385fd273aSBrian Somers { 18485fd273aSBrian Somers int ret; 18585fd273aSBrian Somers 18685fd273aSBrian Somers ID0set0(); 18785fd273aSBrian Somers ret = uu_lock_txfr(basettyname, newpid); 18842df3c25SBrian Somers log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %ld)\n", ret, basettyname, 18942df3c25SBrian Somers (long)newpid); 19085fd273aSBrian Somers ID0setuser(); 19185fd273aSBrian Somers return ret; 19285fd273aSBrian Somers } 19385fd273aSBrian Somers 19485fd273aSBrian Somers int 195b6e82f33SBrian Somers ID0uu_unlock(const char *basettyname) 1965106c671SBrian Somers { 1975106c671SBrian Somers int ret; 1985106c671SBrian Somers 1995106c671SBrian Somers ID0set0(); 200b6e82f33SBrian Somers ret = uu_unlock(basettyname); 201dd7e2610SBrian Somers log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname); 2025106c671SBrian Somers ID0setuser(); 2035106c671SBrian Somers return ret; 2045106c671SBrian Somers } 20545ad566fSBrian Somers 20645ad566fSBrian Somers void 207adc17f0aSEd Schouten ID0login(const struct utmpx *ut) 20845ad566fSBrian Somers { 20945ad566fSBrian Somers ID0set0(); 210adc17f0aSEd Schouten pututxline(ut); 211adc17f0aSEd Schouten log_Printf(LogID0, "pututxline(\"%.*s\", \"%.*s\", \"%.*s\", \"%.*s\")\n", 212adc17f0aSEd Schouten (int)sizeof ut->ut_id, ut->ut_id, 213adc17f0aSEd Schouten (int)sizeof ut->ut_user, ut->ut_user, 214adc17f0aSEd Schouten (int)sizeof ut->ut_line, ut->ut_line, 215adc17f0aSEd Schouten (int)sizeof ut->ut_host, ut->ut_host); 21645ad566fSBrian Somers ID0setuser(); 21745ad566fSBrian Somers } 21845ad566fSBrian Somers 21945ad566fSBrian Somers void 220adc17f0aSEd Schouten ID0logout(const struct utmpx *ut) 22145ad566fSBrian Somers { 22245ad566fSBrian Somers ID0set0(); 223adc17f0aSEd Schouten pututxline(ut); 224adc17f0aSEd Schouten log_Printf(LogID0, "pututxline(\"%.*s\")\n", 225adc17f0aSEd Schouten (int)sizeof ut->ut_id, ut->ut_id); 22645ad566fSBrian Somers ID0setuser(); 22745ad566fSBrian Somers } 2281fa665f5SBrian Somers 2291fa665f5SBrian Somers int 2306f384573SBrian Somers ID0bind_un(int s, const struct sockaddr_un *name) 2311fa665f5SBrian Somers { 2321fa665f5SBrian Somers int result; 2331fa665f5SBrian Somers 2341fa665f5SBrian Somers ID0set0(); 2356f384573SBrian Somers result = bind(s, (const struct sockaddr *)name, sizeof *name); 236dd7e2610SBrian Somers log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n", 2373a2e4f62SBrian Somers result, s, name->sun_path, (int)sizeof(*name)); 2381fa665f5SBrian Somers ID0setuser(); 2391fa665f5SBrian Somers return result; 2401fa665f5SBrian Somers } 2411fa665f5SBrian Somers 2421fa665f5SBrian Somers int 2436f384573SBrian Somers ID0connect_un(int s, const struct sockaddr_un *name) 2441fa665f5SBrian Somers { 2451fa665f5SBrian Somers int result; 2461fa665f5SBrian Somers 2471fa665f5SBrian Somers ID0set0(); 2486f384573SBrian Somers result = connect(s, (const struct sockaddr *)name, sizeof *name); 249dd7e2610SBrian Somers log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n", 2503a2e4f62SBrian Somers result, s, name->sun_path, (int)sizeof(*name)); 2511fa665f5SBrian Somers ID0setuser(); 2521fa665f5SBrian Somers return result; 2531fa665f5SBrian Somers } 2548e7b8599SBrian Somers 2558e7b8599SBrian Somers int 2568e7b8599SBrian Somers ID0kill(pid_t pid, int sig) 2578e7b8599SBrian Somers { 2588e7b8599SBrian Somers int result; 2598e7b8599SBrian Somers 2608e7b8599SBrian Somers ID0set0(); 2618e7b8599SBrian Somers result = kill(pid, sig); 26242df3c25SBrian Somers log_Printf(LogID0, "%d = kill(%ld, %d)\n", result, (long)pid, sig); 2638e7b8599SBrian Somers ID0setuser(); 2648e7b8599SBrian Somers return result; 2658e7b8599SBrian Somers } 266fc3034caSBrian Somers 267fdb4bb1bSBrian Somers #if defined(__FreeBSD__) && !defined(NOKLDLOAD) 268fc3034caSBrian Somers int 269fc3034caSBrian Somers ID0kldload(const char *dev) 270fc3034caSBrian Somers { 271fc3034caSBrian Somers int result; 272fc3034caSBrian Somers 273fc3034caSBrian Somers ID0set0(); 274fc3034caSBrian Somers result = kldload(dev); 275fc3034caSBrian Somers log_Printf(LogID0, "%d = kldload(\"%s\")\n", result, dev); 276fc3034caSBrian Somers ID0setuser(); 277fc3034caSBrian Somers return result; 278fc3034caSBrian Somers } 279fc3034caSBrian Somers #endif 28031dd45c4SBrian Somers 28131dd45c4SBrian Somers #ifndef NONETGRAPH 28231dd45c4SBrian Somers int 28331dd45c4SBrian Somers ID0NgMkSockNode(const char *name, int *cs, int *ds) 28431dd45c4SBrian Somers { 28531dd45c4SBrian Somers int result; 28631dd45c4SBrian Somers 28731dd45c4SBrian Somers ID0set0(); 28831dd45c4SBrian Somers result = NgMkSockNode(name, cs, ds); 28931dd45c4SBrian Somers log_Printf(LogID0, "%d = NgMkSockNode(\"%s\", &cs, &ds)\n", 29031dd45c4SBrian Somers result, name ? name : ""); 29131dd45c4SBrian Somers ID0setuser(); 29231dd45c4SBrian Somers return result; 29331dd45c4SBrian Somers } 29431dd45c4SBrian Somers #endif 295