131921Sbrian/*- 231921Sbrian * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 331921Sbrian * All rights reserved. 431921Sbrian * 531921Sbrian * Redistribution and use in source and binary forms, with or without 631921Sbrian * modification, are permitted provided that the following conditions 731921Sbrian * are met: 831921Sbrian * 1. Redistributions of source code must retain the above copyright 931921Sbrian * notice, this list of conditions and the following disclaimer. 1031921Sbrian * 2. Redistributions in binary form must reproduce the above copyright 1131921Sbrian * notice, this list of conditions and the following disclaimer in the 1231921Sbrian * documentation and/or other materials provided with the distribution. 1331921Sbrian * 1431921Sbrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1531921Sbrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1631921Sbrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1731921Sbrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1831921Sbrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1931921Sbrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2031921Sbrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2131921Sbrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2231921Sbrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2331921Sbrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2431921Sbrian * SUCH DAMAGE. 2531921Sbrian * 2650479Speter * $FreeBSD: releng/11.0/usr.sbin/ppp/id.c 202192 2010-01-13 17:54:32Z ed $ 2731061Sbrian */ 2831061Sbrian 2951525Sbrian#include <sys/param.h> 3031061Sbrian#include <sys/socket.h> 3136285Sbrian#include <sys/un.h> 3231061Sbrian 3331061Sbrian#include <sys/ioctl.h> 3431061Sbrian#include <fcntl.h> 3553535Sbrian#ifndef NONETGRAPH 3653535Sbrian#include <netgraph.h> 3753535Sbrian#endif 3836467Sbrian#include <signal.h> 3936285Sbrian#include <stdarg.h> 4031061Sbrian#include <stdio.h> 4133603Sbrian#include <string.h> 4231061Sbrian#include <sysexits.h> 4351525Sbrian#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 4451525Sbrian#include <sys/linker.h> 4551525Sbrian#endif 4631061Sbrian#include <unistd.h> 4733603Sbrian#ifdef __OpenBSD__ 4833603Sbrian#include <util.h> 4933603Sbrian#else 5033603Sbrian#include <libutil.h> 5133603Sbrian#endif 52202192Sed#include <utmpx.h> 5331061Sbrian 5431061Sbrian#include "log.h" 5531061Sbrian#include "main.h" 5631061Sbrian#include "id.h" 5731061Sbrian 5831061Sbrianstatic int uid; 5931061Sbrianstatic int euid; 6031061Sbrian 6131061Sbrianvoid 6231061SbrianID0init() 6331061Sbrian{ 6431061Sbrian uid = getuid(); 6531061Sbrian euid = geteuid(); 6631061Sbrian} 6731061Sbrian 6831061Sbrianstatic void 6931343SbrianID0setuser(void) 7031061Sbrian{ 7131159Sbrian if (seteuid(uid) == -1) { 7236285Sbrian log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 7336285Sbrian AbortProgram(EX_NOPERM); 7431061Sbrian } 7531061Sbrian} 7631061Sbrian 7731061Sbrianuid_t 7831061SbrianID0realuid() 7931061Sbrian{ 8031061Sbrian return uid; 8131061Sbrian} 8231061Sbrian 8331061Sbrianstatic void 8431343SbrianID0set0(void) 8531061Sbrian{ 8631159Sbrian if (seteuid(euid) == -1) { 8736285Sbrian log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n"); 8836285Sbrian AbortProgram(EX_NOPERM); 8931061Sbrian } 9031061Sbrian} 9131061Sbrian 9231061Sbrianint 9331061SbrianID0ioctl(int fd, unsigned long req, void *arg) 9431061Sbrian{ 9531061Sbrian int ret; 9631061Sbrian 9731061Sbrian ID0set0(); 9831061Sbrian ret = ioctl(fd, req, arg); 9936285Sbrian log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg); 10031061Sbrian ID0setuser(); 10131061Sbrian return ret; 10231061Sbrian} 10331061Sbrian 10431061Sbrianint 10531061SbrianID0unlink(const char *name) 10631061Sbrian{ 10731061Sbrian int ret; 10831061Sbrian 10931061Sbrian ID0set0(); 11031061Sbrian ret = unlink(name); 11136285Sbrian log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name); 11231061Sbrian ID0setuser(); 11331061Sbrian return ret; 11431061Sbrian} 11531061Sbrian 11631061Sbrianint 11731061SbrianID0socket(int domain, int type, int protocol) 11831061Sbrian{ 11931061Sbrian int ret; 12031061Sbrian 12131061Sbrian ID0set0(); 12231061Sbrian ret = socket(domain, type, protocol); 12336285Sbrian log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol); 12431061Sbrian ID0setuser(); 12531061Sbrian return ret; 12631061Sbrian} 12731061Sbrian 12831061SbrianFILE * 12931061SbrianID0fopen(const char *path, const char *mode) 13031061Sbrian{ 13131061Sbrian FILE *ret; 13231061Sbrian 13331061Sbrian ID0set0(); 13431061Sbrian ret = fopen(path, mode); 13536285Sbrian log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode); 13631061Sbrian ID0setuser(); 13731061Sbrian return ret; 13831061Sbrian} 13931061Sbrian 14031061Sbrianint 14136285SbrianID0open(const char *path, int flags, ...) 14231061Sbrian{ 14331061Sbrian int ret; 14436285Sbrian va_list ap; 14531061Sbrian 14636285Sbrian va_start(ap, flags); 14731061Sbrian ID0set0(); 14836285Sbrian ret = open(path, flags, va_arg(ap, int)); 14936285Sbrian log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags); 15031061Sbrian ID0setuser(); 15136285Sbrian va_end(ap); 15231061Sbrian return ret; 15331061Sbrian} 15431061Sbrian 15531061Sbrianint 15632025SbrianID0write(int fd, const void *data, size_t len) 15732025Sbrian{ 15832025Sbrian int ret; 15932025Sbrian 16032025Sbrian ID0set0(); 16132025Sbrian ret = write(fd, data, len); 16237210Sbrian log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len); 16332025Sbrian ID0setuser(); 16432025Sbrian return ret; 16532025Sbrian} 16632025Sbrian 16732025Sbrianint 16831343SbrianID0uu_lock(const char *basettyname) 16931061Sbrian{ 17031061Sbrian int ret; 17131061Sbrian 17231061Sbrian ID0set0(); 17331343Sbrian ret = uu_lock(basettyname); 17436285Sbrian log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname); 17531061Sbrian ID0setuser(); 17631061Sbrian return ret; 17731061Sbrian} 17831061Sbrian 17931061Sbrianint 18036450SbrianID0uu_lock_txfr(const char *basettyname, pid_t newpid) 18136450Sbrian{ 18236450Sbrian int ret; 18336450Sbrian 18436450Sbrian ID0set0(); 18536450Sbrian ret = uu_lock_txfr(basettyname, newpid); 18697360Sbrian log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %ld)\n", ret, basettyname, 18797360Sbrian (long)newpid); 18836450Sbrian ID0setuser(); 18936450Sbrian return ret; 19036450Sbrian} 19136450Sbrian 19236450Sbrianint 19331343SbrianID0uu_unlock(const char *basettyname) 19431061Sbrian{ 19531061Sbrian int ret; 19631061Sbrian 19731061Sbrian ID0set0(); 19831343Sbrian ret = uu_unlock(basettyname); 19936285Sbrian log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname); 20031061Sbrian ID0setuser(); 20131061Sbrian return ret; 20231061Sbrian} 20333603Sbrian 20433603Sbrianvoid 205202192SedID0login(const struct utmpx *ut) 20633603Sbrian{ 20733603Sbrian ID0set0(); 208202192Sed pututxline(ut); 209202192Sed log_Printf(LogID0, "pututxline(\"%.*s\", \"%.*s\", \"%.*s\", \"%.*s\")\n", 210202192Sed (int)sizeof ut->ut_id, ut->ut_id, 211202192Sed (int)sizeof ut->ut_user, ut->ut_user, 212202192Sed (int)sizeof ut->ut_line, ut->ut_line, 213202192Sed (int)sizeof ut->ut_host, ut->ut_host); 21433603Sbrian ID0setuser(); 21533603Sbrian} 21633603Sbrian 21733603Sbrianvoid 218202192SedID0logout(const struct utmpx *ut) 21933603Sbrian{ 22033603Sbrian ID0set0(); 221202192Sed pututxline(ut); 222202192Sed log_Printf(LogID0, "pututxline(\"%.*s\")\n", 223202192Sed (int)sizeof ut->ut_id, ut->ut_id); 22433603Sbrian ID0setuser(); 22533603Sbrian} 22636285Sbrian 22736285Sbrianint 22836285SbrianID0bind_un(int s, const struct sockaddr_un *name) 22936285Sbrian{ 23036285Sbrian int result; 23136285Sbrian 23236285Sbrian ID0set0(); 23336285Sbrian result = bind(s, (const struct sockaddr *)name, sizeof *name); 23436285Sbrian log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n", 23537210Sbrian result, s, name->sun_path, (int)sizeof(*name)); 23636285Sbrian ID0setuser(); 23736285Sbrian return result; 23836285Sbrian} 23936285Sbrian 24036285Sbrianint 24136285SbrianID0connect_un(int s, const struct sockaddr_un *name) 24236285Sbrian{ 24336285Sbrian int result; 24436285Sbrian 24536285Sbrian ID0set0(); 24636285Sbrian result = connect(s, (const struct sockaddr *)name, sizeof *name); 24736285Sbrian log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n", 24837210Sbrian result, s, name->sun_path, (int)sizeof(*name)); 24936285Sbrian ID0setuser(); 25036285Sbrian return result; 25136285Sbrian} 25236467Sbrian 25336467Sbrianint 25436467SbrianID0kill(pid_t pid, int sig) 25536467Sbrian{ 25636467Sbrian int result; 25736467Sbrian 25836467Sbrian ID0set0(); 25936467Sbrian result = kill(pid, sig); 26097360Sbrian log_Printf(LogID0, "%d = kill(%ld, %d)\n", result, (long)pid, sig); 26136467Sbrian ID0setuser(); 26236467Sbrian return result; 26336467Sbrian} 26451525Sbrian 26553241Sbrian#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 26651525Sbrianint 26751525SbrianID0kldload(const char *dev) 26851525Sbrian{ 26951525Sbrian int result; 27051525Sbrian 27151525Sbrian ID0set0(); 27251525Sbrian result = kldload(dev); 27351525Sbrian log_Printf(LogID0, "%d = kldload(\"%s\")\n", result, dev); 27451525Sbrian ID0setuser(); 27551525Sbrian return result; 27651525Sbrian} 27751525Sbrian#endif 27853535Sbrian 27953535Sbrian#ifndef NONETGRAPH 28053535Sbrianint 28153535SbrianID0NgMkSockNode(const char *name, int *cs, int *ds) 28253535Sbrian{ 28353535Sbrian int result; 28453535Sbrian 28553535Sbrian ID0set0(); 28653535Sbrian result = NgMkSockNode(name, cs, ds); 28753535Sbrian log_Printf(LogID0, "%d = NgMkSockNode(\"%s\", &cs, &ds)\n", 28853535Sbrian result, name ? name : ""); 28953535Sbrian ID0setuser(); 29053535Sbrian return result; 29153535Sbrian} 29253535Sbrian#endif 293