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 * 26c39934eaSBrian Somers * $Id$ 275106c671SBrian Somers */ 285106c671SBrian Somers 295106c671SBrian Somers #include <sys/types.h> 305106c671SBrian Somers #include <sys/socket.h> 315106c671SBrian Somers 325106c671SBrian Somers #include <sys/ioctl.h> 335106c671SBrian Somers #include <fcntl.h> 345106c671SBrian Somers #include <stdio.h> 355106c671SBrian Somers #include <stdlib.h> 365106c671SBrian Somers #include <sysexits.h> 375106c671SBrian Somers #include <unistd.h> 385106c671SBrian Somers 39b6e82f33SBrian Somers #include "command.h" 405106c671SBrian Somers #include "mbuf.h" 415106c671SBrian Somers #include "log.h" 425106c671SBrian Somers #include "main.h" 435106c671SBrian Somers #ifdef __OpenBSD__ 445106c671SBrian Somers #include <util.h> 455106c671SBrian Somers #else 465106c671SBrian Somers #include <libutil.h> 475106c671SBrian Somers #endif 485106c671SBrian Somers #include "id.h" 495106c671SBrian Somers 505106c671SBrian Somers static int uid; 515106c671SBrian Somers static int gid; 525106c671SBrian Somers static int euid; 535106c671SBrian Somers static int egid; 545106c671SBrian Somers 555106c671SBrian Somers void 565106c671SBrian Somers ID0init() 575106c671SBrian Somers { 585106c671SBrian Somers uid = getuid(); 595106c671SBrian Somers gid = getgid(); 605106c671SBrian Somers euid = geteuid(); 615106c671SBrian Somers egid = getegid(); 625106c671SBrian Somers } 635106c671SBrian Somers 645106c671SBrian Somers static void 65b6e82f33SBrian Somers ID0setuser(void) 665106c671SBrian Somers { 679fecb4e6SBrian Somers if (seteuid(uid) == -1) { 689fecb4e6SBrian Somers LogPrintf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 695106c671SBrian Somers Cleanup(EX_NOPERM); 705106c671SBrian Somers } 715106c671SBrian Somers } 725106c671SBrian Somers 735106c671SBrian Somers uid_t 745106c671SBrian Somers ID0realuid() 755106c671SBrian Somers { 765106c671SBrian Somers return uid; 775106c671SBrian Somers } 785106c671SBrian Somers 795106c671SBrian Somers static void 80b6e82f33SBrian Somers ID0set0(void) 815106c671SBrian Somers { 829fecb4e6SBrian Somers if (seteuid(euid) == -1) { 839fecb4e6SBrian Somers LogPrintf(LogERROR, "ID0set0: Unable to seteuid!\n"); 845106c671SBrian Somers Cleanup(EX_NOPERM); 855106c671SBrian Somers } 865106c671SBrian Somers } 875106c671SBrian Somers 885106c671SBrian Somers int 895106c671SBrian Somers ID0ioctl(int fd, unsigned long req, void *arg) 905106c671SBrian Somers { 915106c671SBrian Somers int ret; 925106c671SBrian Somers 935106c671SBrian Somers ID0set0(); 945106c671SBrian Somers ret = ioctl(fd, req, arg); 955106c671SBrian Somers LogPrintf(LogID0, "%d = ioctl(%d, %d, %p)\n", ret, fd, req, arg); 965106c671SBrian Somers ID0setuser(); 975106c671SBrian Somers return ret; 985106c671SBrian Somers } 995106c671SBrian Somers 1005106c671SBrian Somers int 1015106c671SBrian Somers ID0unlink(const char *name) 1025106c671SBrian Somers { 1035106c671SBrian Somers int ret; 1045106c671SBrian Somers 1055106c671SBrian Somers ID0set0(); 1065106c671SBrian Somers ret = unlink(name); 1075106c671SBrian Somers LogPrintf(LogID0, "%d = unlink(\"%s\")\n", ret, name); 1085106c671SBrian Somers ID0setuser(); 1095106c671SBrian Somers return ret; 1105106c671SBrian Somers } 1115106c671SBrian Somers 1125106c671SBrian Somers int 1135106c671SBrian Somers ID0socket(int domain, int type, int protocol) 1145106c671SBrian Somers { 1155106c671SBrian Somers int ret; 1165106c671SBrian Somers 1175106c671SBrian Somers ID0set0(); 1185106c671SBrian Somers ret = socket(domain, type, protocol); 1195106c671SBrian Somers LogPrintf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol); 1205106c671SBrian Somers ID0setuser(); 1215106c671SBrian Somers return ret; 1225106c671SBrian Somers } 1235106c671SBrian Somers 1245106c671SBrian Somers FILE * 1255106c671SBrian Somers ID0fopen(const char *path, const char *mode) 1265106c671SBrian Somers { 1275106c671SBrian Somers FILE *ret; 1285106c671SBrian Somers 1295106c671SBrian Somers ID0set0(); 1305106c671SBrian Somers ret = fopen(path, mode); 1315106c671SBrian Somers LogPrintf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode); 1325106c671SBrian Somers ID0setuser(); 1335106c671SBrian Somers return ret; 1345106c671SBrian Somers } 1355106c671SBrian Somers 1365106c671SBrian Somers int 1375106c671SBrian Somers ID0open(const char *path, int flags) 1385106c671SBrian Somers { 1395106c671SBrian Somers int ret; 1405106c671SBrian Somers 1415106c671SBrian Somers ID0set0(); 1425106c671SBrian Somers ret = open(path, flags); 1435106c671SBrian Somers LogPrintf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags); 1445106c671SBrian Somers ID0setuser(); 1455106c671SBrian Somers return ret; 1465106c671SBrian Somers } 1475106c671SBrian Somers 1485106c671SBrian Somers int 149b6e82f33SBrian Somers ID0uu_lock(const char *basettyname) 1505106c671SBrian Somers { 1515106c671SBrian Somers int ret; 1525106c671SBrian Somers 1535106c671SBrian Somers ID0set0(); 154b6e82f33SBrian Somers ret = uu_lock(basettyname); 155b6e82f33SBrian Somers LogPrintf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname); 1565106c671SBrian Somers ID0setuser(); 1575106c671SBrian Somers return ret; 1585106c671SBrian Somers } 1595106c671SBrian Somers 1605106c671SBrian Somers int 161b6e82f33SBrian Somers ID0uu_unlock(const char *basettyname) 1625106c671SBrian Somers { 1635106c671SBrian Somers int ret; 1645106c671SBrian Somers 1655106c671SBrian Somers ID0set0(); 166b6e82f33SBrian Somers ret = uu_unlock(basettyname); 167b6e82f33SBrian Somers LogPrintf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname); 1685106c671SBrian Somers ID0setuser(); 1695106c671SBrian Somers return ret; 1705106c671SBrian Somers } 171