1c39934eaSBrian Somers /*- 2c39934eaSBrian Somers * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3c39934eaSBrian Somers * All rights reserved. 4c39934eaSBrian Somers * 5c39934eaSBrian Somers * Redistribution and use in source and binary forms, with or without 6c39934eaSBrian Somers * modification, are permitted provided that the following conditions 7c39934eaSBrian Somers * are met: 8c39934eaSBrian Somers * 1. Redistributions of source code must retain the above copyright 9c39934eaSBrian Somers * notice, this list of conditions and the following disclaimer. 10c39934eaSBrian Somers * 2. Redistributions in binary form must reproduce the above copyright 11c39934eaSBrian Somers * notice, this list of conditions and the following disclaimer in the 12c39934eaSBrian Somers * documentation and/or other materials provided with the distribution. 13c39934eaSBrian Somers * 14c39934eaSBrian Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15c39934eaSBrian Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16c39934eaSBrian Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17c39934eaSBrian Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18c39934eaSBrian Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19c39934eaSBrian Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20c39934eaSBrian Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21c39934eaSBrian Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22c39934eaSBrian Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23c39934eaSBrian Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24c39934eaSBrian Somers * SUCH DAMAGE. 25c39934eaSBrian Somers * 263a2e4f62SBrian Somers * $Id: id.c,v 1.10 1998/05/29 18:33:08 brian Exp $ 275106c671SBrian Somers */ 285106c671SBrian Somers 295106c671SBrian Somers #include <sys/types.h> 305106c671SBrian Somers #include <sys/socket.h> 311fa665f5SBrian Somers #include <sys/un.h> 325106c671SBrian Somers 335106c671SBrian Somers #include <sys/ioctl.h> 345106c671SBrian Somers #include <fcntl.h> 358e7b8599SBrian Somers #include <signal.h> 363edeb0c6SBrian Somers #include <stdarg.h> 375106c671SBrian Somers #include <stdio.h> 3845ad566fSBrian Somers #include <string.h> 395106c671SBrian Somers #include <sysexits.h> 405106c671SBrian Somers #include <unistd.h> 415106c671SBrian Somers #ifdef __OpenBSD__ 425106c671SBrian Somers #include <util.h> 435106c671SBrian Somers #else 445106c671SBrian Somers #include <libutil.h> 455106c671SBrian Somers #endif 4645ad566fSBrian Somers #include <utmp.h> 4745ad566fSBrian Somers 4845ad566fSBrian Somers #include "log.h" 4945ad566fSBrian Somers #include "main.h" 505106c671SBrian Somers #include "id.h" 515106c671SBrian Somers 525106c671SBrian Somers static int uid; 535106c671SBrian Somers static int euid; 545106c671SBrian Somers 555106c671SBrian Somers void 565106c671SBrian Somers ID0init() 575106c671SBrian Somers { 585106c671SBrian Somers uid = getuid(); 595106c671SBrian Somers euid = geteuid(); 605106c671SBrian Somers } 615106c671SBrian Somers 625106c671SBrian Somers static void 63b6e82f33SBrian Somers ID0setuser(void) 645106c671SBrian Somers { 659fecb4e6SBrian Somers if (seteuid(uid) == -1) { 66dd7e2610SBrian Somers log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 671afedc4bSBrian Somers AbortProgram(EX_NOPERM); 685106c671SBrian Somers } 695106c671SBrian Somers } 705106c671SBrian Somers 715106c671SBrian Somers uid_t 725106c671SBrian Somers ID0realuid() 735106c671SBrian Somers { 745106c671SBrian Somers return uid; 755106c671SBrian Somers } 765106c671SBrian Somers 775106c671SBrian Somers static void 78b6e82f33SBrian Somers ID0set0(void) 795106c671SBrian Somers { 809fecb4e6SBrian Somers if (seteuid(euid) == -1) { 81dd7e2610SBrian Somers log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n"); 821afedc4bSBrian Somers AbortProgram(EX_NOPERM); 835106c671SBrian Somers } 845106c671SBrian Somers } 855106c671SBrian Somers 865106c671SBrian Somers int 875106c671SBrian Somers ID0ioctl(int fd, unsigned long req, void *arg) 885106c671SBrian Somers { 895106c671SBrian Somers int ret; 905106c671SBrian Somers 915106c671SBrian Somers ID0set0(); 925106c671SBrian Somers ret = ioctl(fd, req, arg); 93dd7e2610SBrian Somers log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg); 945106c671SBrian Somers ID0setuser(); 955106c671SBrian Somers return ret; 965106c671SBrian Somers } 975106c671SBrian Somers 985106c671SBrian Somers int 995106c671SBrian Somers ID0unlink(const char *name) 1005106c671SBrian Somers { 1015106c671SBrian Somers int ret; 1025106c671SBrian Somers 1035106c671SBrian Somers ID0set0(); 1045106c671SBrian Somers ret = unlink(name); 105dd7e2610SBrian Somers log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name); 1065106c671SBrian Somers ID0setuser(); 1075106c671SBrian Somers return ret; 1085106c671SBrian Somers } 1095106c671SBrian Somers 1105106c671SBrian Somers int 1115106c671SBrian Somers ID0socket(int domain, int type, int protocol) 1125106c671SBrian Somers { 1135106c671SBrian Somers int ret; 1145106c671SBrian Somers 1155106c671SBrian Somers ID0set0(); 1165106c671SBrian Somers ret = socket(domain, type, protocol); 117dd7e2610SBrian Somers log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol); 1185106c671SBrian Somers ID0setuser(); 1195106c671SBrian Somers return ret; 1205106c671SBrian Somers } 1215106c671SBrian Somers 1225106c671SBrian Somers FILE * 1235106c671SBrian Somers ID0fopen(const char *path, const char *mode) 1245106c671SBrian Somers { 1255106c671SBrian Somers FILE *ret; 1265106c671SBrian Somers 1275106c671SBrian Somers ID0set0(); 1285106c671SBrian Somers ret = fopen(path, mode); 129dd7e2610SBrian Somers log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode); 1305106c671SBrian Somers ID0setuser(); 1315106c671SBrian Somers return ret; 1325106c671SBrian Somers } 1335106c671SBrian Somers 1345106c671SBrian Somers int 1353edeb0c6SBrian Somers ID0open(const char *path, int flags, ...) 1365106c671SBrian Somers { 1375106c671SBrian Somers int ret; 1383edeb0c6SBrian Somers va_list ap; 1395106c671SBrian Somers 1403edeb0c6SBrian Somers va_start(ap, flags); 1415106c671SBrian Somers ID0set0(); 1423edeb0c6SBrian Somers ret = open(path, flags, va_arg(ap, int)); 143dd7e2610SBrian Somers log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags); 1445106c671SBrian Somers ID0setuser(); 1453edeb0c6SBrian Somers va_end(ap); 1465106c671SBrian Somers return ret; 1475106c671SBrian Somers } 1485106c671SBrian Somers 1495106c671SBrian Somers int 150de7453bbSBrian Somers ID0write(int fd, const void *data, size_t len) 151de7453bbSBrian Somers { 152de7453bbSBrian Somers int ret; 153de7453bbSBrian Somers 154de7453bbSBrian Somers ID0set0(); 155de7453bbSBrian Somers ret = write(fd, data, len); 1563a2e4f62SBrian Somers log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len); 157de7453bbSBrian Somers ID0setuser(); 158de7453bbSBrian Somers return ret; 159de7453bbSBrian Somers } 160de7453bbSBrian Somers 161de7453bbSBrian Somers int 162b6e82f33SBrian Somers ID0uu_lock(const char *basettyname) 1635106c671SBrian Somers { 1645106c671SBrian Somers int ret; 1655106c671SBrian Somers 1665106c671SBrian Somers ID0set0(); 167b6e82f33SBrian Somers ret = uu_lock(basettyname); 168dd7e2610SBrian Somers log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname); 1695106c671SBrian Somers ID0setuser(); 1705106c671SBrian Somers return ret; 1715106c671SBrian Somers } 1725106c671SBrian Somers 1735106c671SBrian Somers int 17485fd273aSBrian Somers ID0uu_lock_txfr(const char *basettyname, pid_t newpid) 17585fd273aSBrian Somers { 17685fd273aSBrian Somers int ret; 17785fd273aSBrian Somers 17885fd273aSBrian Somers ID0set0(); 17985fd273aSBrian Somers ret = uu_lock_txfr(basettyname, newpid); 18085fd273aSBrian Somers log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %d)\n", ret, basettyname, 18185fd273aSBrian Somers (int)newpid); 18285fd273aSBrian Somers ID0setuser(); 18385fd273aSBrian Somers return ret; 18485fd273aSBrian Somers } 18585fd273aSBrian Somers 18685fd273aSBrian Somers int 187b6e82f33SBrian Somers ID0uu_unlock(const char *basettyname) 1885106c671SBrian Somers { 1895106c671SBrian Somers int ret; 1905106c671SBrian Somers 1915106c671SBrian Somers ID0set0(); 192b6e82f33SBrian Somers ret = uu_unlock(basettyname); 193dd7e2610SBrian Somers log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname); 1945106c671SBrian Somers ID0setuser(); 1955106c671SBrian Somers return ret; 1965106c671SBrian Somers } 19745ad566fSBrian Somers 19845ad566fSBrian Somers void 19945ad566fSBrian Somers ID0login(struct utmp *ut) 20045ad566fSBrian Somers { 20145ad566fSBrian Somers ID0set0(); 20245ad566fSBrian Somers if (logout(ut->ut_line)) { 203dd7e2610SBrian Somers log_Printf(LogID0, "logout(\"%s\")\n", ut->ut_line); 20445ad566fSBrian Somers logwtmp(ut->ut_line, "", ""); 205dd7e2610SBrian Somers log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut->ut_line); 20645ad566fSBrian Somers } 20745ad566fSBrian Somers login(ut); 208dd7e2610SBrian Somers log_Printf(LogID0, "login(\"%s\", \"%.*s\")\n", 209fe3125a0SBrian Somers ut->ut_line, (int)(sizeof ut->ut_name), ut->ut_name); 21045ad566fSBrian Somers ID0setuser(); 21145ad566fSBrian Somers } 21245ad566fSBrian Somers 21345ad566fSBrian Somers void 21445ad566fSBrian Somers ID0logout(const char *device) 21545ad566fSBrian Somers { 21645ad566fSBrian Somers struct utmp ut; 21745ad566fSBrian Somers 21845ad566fSBrian Somers strncpy(ut.ut_line, device, sizeof ut.ut_line - 1); 21945ad566fSBrian Somers ut.ut_line[sizeof ut.ut_line - 1] = '\0'; 22045ad566fSBrian Somers 22145ad566fSBrian Somers ID0set0(); 22245ad566fSBrian Somers if (logout(ut.ut_line)) { 223dd7e2610SBrian Somers log_Printf(LogID0, "logout(\"%s\")\n", ut.ut_line); 22445ad566fSBrian Somers logwtmp(ut.ut_line, "", ""); 225dd7e2610SBrian Somers log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut.ut_line); 22645ad566fSBrian Somers } else 227dd7e2610SBrian Somers log_Printf(LogERROR, "ID0logout: No longer logged in on %s\n", ut.ut_line); 22845ad566fSBrian Somers ID0setuser(); 22945ad566fSBrian Somers } 2301fa665f5SBrian Somers 2311fa665f5SBrian Somers int 2326f384573SBrian Somers ID0bind_un(int s, const struct sockaddr_un *name) 2331fa665f5SBrian Somers { 2341fa665f5SBrian Somers int result; 2351fa665f5SBrian Somers 2361fa665f5SBrian Somers ID0set0(); 2376f384573SBrian Somers result = bind(s, (const struct sockaddr *)name, sizeof *name); 238dd7e2610SBrian Somers log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n", 2393a2e4f62SBrian Somers result, s, name->sun_path, (int)sizeof(*name)); 2401fa665f5SBrian Somers ID0setuser(); 2411fa665f5SBrian Somers return result; 2421fa665f5SBrian Somers } 2431fa665f5SBrian Somers 2441fa665f5SBrian Somers int 2456f384573SBrian Somers ID0connect_un(int s, const struct sockaddr_un *name) 2461fa665f5SBrian Somers { 2471fa665f5SBrian Somers int result; 2481fa665f5SBrian Somers 2491fa665f5SBrian Somers ID0set0(); 2506f384573SBrian Somers result = connect(s, (const struct sockaddr *)name, sizeof *name); 251dd7e2610SBrian Somers log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n", 2523a2e4f62SBrian Somers result, s, name->sun_path, (int)sizeof(*name)); 2531fa665f5SBrian Somers ID0setuser(); 2541fa665f5SBrian Somers return result; 2551fa665f5SBrian Somers } 2568e7b8599SBrian Somers 2578e7b8599SBrian Somers int 2588e7b8599SBrian Somers ID0kill(pid_t pid, int sig) 2598e7b8599SBrian Somers { 2608e7b8599SBrian Somers int result; 2618e7b8599SBrian Somers 2628e7b8599SBrian Somers ID0set0(); 2638e7b8599SBrian Somers result = kill(pid, sig); 2648e7b8599SBrian Somers log_Printf(LogID0, "%d = kill(%d, %d)\n", result, (int)pid, sig); 2658e7b8599SBrian Somers ID0setuser(); 2668e7b8599SBrian Somers return result; 2678e7b8599SBrian Somers } 268