1c39934eaSBrian Somers /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
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.
275106c671SBrian Somers */
285106c671SBrian Somers
29fc3034caSBrian Somers #include <sys/param.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>
3531dd45c4SBrian Somers #ifndef NONETGRAPH
3631dd45c4SBrian Somers #include <netgraph.h>
3731dd45c4SBrian Somers #endif
388e7b8599SBrian Somers #include <signal.h>
393edeb0c6SBrian Somers #include <stdarg.h>
405106c671SBrian Somers #include <stdio.h>
4145ad566fSBrian Somers #include <string.h>
425106c671SBrian Somers #include <sysexits.h>
43fc3034caSBrian Somers #if defined(__FreeBSD__) && !defined(NOKLDLOAD)
44fc3034caSBrian Somers #include <sys/linker.h>
45fc3034caSBrian Somers #endif
465106c671SBrian Somers #include <unistd.h>
475106c671SBrian Somers #ifdef __OpenBSD__
485106c671SBrian Somers #include <util.h>
495106c671SBrian Somers #else
505106c671SBrian Somers #include <libutil.h>
515106c671SBrian Somers #endif
52adc17f0aSEd Schouten #include <utmpx.h>
5345ad566fSBrian Somers
5445ad566fSBrian Somers #include "log.h"
5545ad566fSBrian Somers #include "main.h"
565106c671SBrian Somers #include "id.h"
575106c671SBrian Somers
585106c671SBrian Somers static int uid;
595106c671SBrian Somers static int euid;
605106c671SBrian Somers
615106c671SBrian Somers void
ID0init(void)62672eba24SJohn Baldwin ID0init(void)
635106c671SBrian Somers {
645106c671SBrian Somers uid = getuid();
655106c671SBrian Somers euid = geteuid();
665106c671SBrian Somers }
675106c671SBrian Somers
685106c671SBrian Somers static void
ID0setuser(void)69b6e82f33SBrian Somers ID0setuser(void)
705106c671SBrian Somers {
719fecb4e6SBrian Somers if (seteuid(uid) == -1) {
72dd7e2610SBrian Somers log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n");
731afedc4bSBrian Somers AbortProgram(EX_NOPERM);
745106c671SBrian Somers }
755106c671SBrian Somers }
765106c671SBrian Somers
775106c671SBrian Somers uid_t
ID0realuid(void)78672eba24SJohn Baldwin ID0realuid(void)
795106c671SBrian Somers {
805106c671SBrian Somers return uid;
815106c671SBrian Somers }
825106c671SBrian Somers
835106c671SBrian Somers static void
ID0set0(void)84b6e82f33SBrian Somers ID0set0(void)
855106c671SBrian Somers {
869fecb4e6SBrian Somers if (seteuid(euid) == -1) {
87dd7e2610SBrian Somers log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n");
881afedc4bSBrian Somers AbortProgram(EX_NOPERM);
895106c671SBrian Somers }
905106c671SBrian Somers }
915106c671SBrian Somers
925106c671SBrian Somers int
ID0ioctl(int fd,unsigned long req,void * arg)935106c671SBrian Somers ID0ioctl(int fd, unsigned long req, void *arg)
945106c671SBrian Somers {
955106c671SBrian Somers int ret;
965106c671SBrian Somers
975106c671SBrian Somers ID0set0();
985106c671SBrian Somers ret = ioctl(fd, req, arg);
99dd7e2610SBrian Somers log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg);
1005106c671SBrian Somers ID0setuser();
1015106c671SBrian Somers return ret;
1025106c671SBrian Somers }
1035106c671SBrian Somers
1045106c671SBrian Somers int
ID0unlink(const char * name)1055106c671SBrian Somers ID0unlink(const char *name)
1065106c671SBrian Somers {
1075106c671SBrian Somers int ret;
1085106c671SBrian Somers
1095106c671SBrian Somers ID0set0();
1105106c671SBrian Somers ret = unlink(name);
111dd7e2610SBrian Somers log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name);
1125106c671SBrian Somers ID0setuser();
1135106c671SBrian Somers return ret;
1145106c671SBrian Somers }
1155106c671SBrian Somers
1165106c671SBrian Somers int
ID0socket(int domain,int type,int protocol)1175106c671SBrian Somers ID0socket(int domain, int type, int protocol)
1185106c671SBrian Somers {
1195106c671SBrian Somers int ret;
1205106c671SBrian Somers
1215106c671SBrian Somers ID0set0();
1225106c671SBrian Somers ret = socket(domain, type, protocol);
123dd7e2610SBrian Somers log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol);
1245106c671SBrian Somers ID0setuser();
1255106c671SBrian Somers return ret;
1265106c671SBrian Somers }
1275106c671SBrian Somers
1285106c671SBrian Somers FILE *
ID0fopen(const char * path,const char * mode)1295106c671SBrian Somers ID0fopen(const char *path, const char *mode)
1305106c671SBrian Somers {
1315106c671SBrian Somers FILE *ret;
1325106c671SBrian Somers
1335106c671SBrian Somers ID0set0();
1345106c671SBrian Somers ret = fopen(path, mode);
135dd7e2610SBrian Somers log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode);
1365106c671SBrian Somers ID0setuser();
1375106c671SBrian Somers return ret;
1385106c671SBrian Somers }
1395106c671SBrian Somers
1405106c671SBrian Somers int
ID0open(const char * path,int flags,...)1413edeb0c6SBrian Somers ID0open(const char *path, int flags, ...)
1425106c671SBrian Somers {
1435106c671SBrian Somers int ret;
1443edeb0c6SBrian Somers va_list ap;
1455106c671SBrian Somers
1463edeb0c6SBrian Somers va_start(ap, flags);
1475106c671SBrian Somers ID0set0();
1483edeb0c6SBrian Somers ret = open(path, flags, va_arg(ap, int));
149dd7e2610SBrian Somers log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags);
1505106c671SBrian Somers ID0setuser();
1513edeb0c6SBrian Somers va_end(ap);
1525106c671SBrian Somers return ret;
1535106c671SBrian Somers }
1545106c671SBrian Somers
1555106c671SBrian Somers int
ID0write(int fd,const void * data,size_t len)156de7453bbSBrian Somers ID0write(int fd, const void *data, size_t len)
157de7453bbSBrian Somers {
158de7453bbSBrian Somers int ret;
159de7453bbSBrian Somers
160de7453bbSBrian Somers ID0set0();
161de7453bbSBrian Somers ret = write(fd, data, len);
1623a2e4f62SBrian Somers log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len);
163de7453bbSBrian Somers ID0setuser();
164de7453bbSBrian Somers return ret;
165de7453bbSBrian Somers }
166de7453bbSBrian Somers
167de7453bbSBrian Somers int
ID0uu_lock(const char * basettyname)168b6e82f33SBrian Somers ID0uu_lock(const char *basettyname)
1695106c671SBrian Somers {
1705106c671SBrian Somers int ret;
1715106c671SBrian Somers
1725106c671SBrian Somers ID0set0();
173b6e82f33SBrian Somers ret = uu_lock(basettyname);
174dd7e2610SBrian Somers log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname);
1755106c671SBrian Somers ID0setuser();
1765106c671SBrian Somers return ret;
1775106c671SBrian Somers }
1785106c671SBrian Somers
1795106c671SBrian Somers int
ID0uu_lock_txfr(const char * basettyname,pid_t newpid)18085fd273aSBrian Somers ID0uu_lock_txfr(const char *basettyname, pid_t newpid)
18185fd273aSBrian Somers {
18285fd273aSBrian Somers int ret;
18385fd273aSBrian Somers
18485fd273aSBrian Somers ID0set0();
18585fd273aSBrian Somers ret = uu_lock_txfr(basettyname, newpid);
18642df3c25SBrian Somers log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %ld)\n", ret, basettyname,
18742df3c25SBrian Somers (long)newpid);
18885fd273aSBrian Somers ID0setuser();
18985fd273aSBrian Somers return ret;
19085fd273aSBrian Somers }
19185fd273aSBrian Somers
19285fd273aSBrian Somers int
ID0uu_unlock(const char * basettyname)193b6e82f33SBrian Somers ID0uu_unlock(const char *basettyname)
1945106c671SBrian Somers {
1955106c671SBrian Somers int ret;
1965106c671SBrian Somers
1975106c671SBrian Somers ID0set0();
198b6e82f33SBrian Somers ret = uu_unlock(basettyname);
199dd7e2610SBrian Somers log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname);
2005106c671SBrian Somers ID0setuser();
2015106c671SBrian Somers return ret;
2025106c671SBrian Somers }
20345ad566fSBrian Somers
20445ad566fSBrian Somers void
ID0login(const struct utmpx * ut)205adc17f0aSEd Schouten ID0login(const struct utmpx *ut)
20645ad566fSBrian Somers {
20745ad566fSBrian Somers ID0set0();
208adc17f0aSEd Schouten pututxline(ut);
209adc17f0aSEd Schouten log_Printf(LogID0, "pututxline(\"%.*s\", \"%.*s\", \"%.*s\", \"%.*s\")\n",
210adc17f0aSEd Schouten (int)sizeof ut->ut_id, ut->ut_id,
211adc17f0aSEd Schouten (int)sizeof ut->ut_user, ut->ut_user,
212adc17f0aSEd Schouten (int)sizeof ut->ut_line, ut->ut_line,
213adc17f0aSEd Schouten (int)sizeof ut->ut_host, ut->ut_host);
21445ad566fSBrian Somers ID0setuser();
21545ad566fSBrian Somers }
21645ad566fSBrian Somers
21745ad566fSBrian Somers void
ID0logout(const struct utmpx * ut)218adc17f0aSEd Schouten ID0logout(const struct utmpx *ut)
21945ad566fSBrian Somers {
22045ad566fSBrian Somers ID0set0();
221adc17f0aSEd Schouten pututxline(ut);
222adc17f0aSEd Schouten log_Printf(LogID0, "pututxline(\"%.*s\")\n",
223adc17f0aSEd Schouten (int)sizeof ut->ut_id, ut->ut_id);
22445ad566fSBrian Somers ID0setuser();
22545ad566fSBrian Somers }
2261fa665f5SBrian Somers
2271fa665f5SBrian Somers int
ID0bind_un(int s,const struct sockaddr_un * name)2286f384573SBrian Somers ID0bind_un(int s, const struct sockaddr_un *name)
2291fa665f5SBrian Somers {
2301fa665f5SBrian Somers int result;
2311fa665f5SBrian Somers
2321fa665f5SBrian Somers ID0set0();
2336f384573SBrian Somers result = bind(s, (const struct sockaddr *)name, sizeof *name);
234dd7e2610SBrian Somers log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n",
2353a2e4f62SBrian Somers result, s, name->sun_path, (int)sizeof(*name));
2361fa665f5SBrian Somers ID0setuser();
2371fa665f5SBrian Somers return result;
2381fa665f5SBrian Somers }
2391fa665f5SBrian Somers
2401fa665f5SBrian Somers int
ID0connect_un(int s,const struct sockaddr_un * name)2416f384573SBrian Somers ID0connect_un(int s, const struct sockaddr_un *name)
2421fa665f5SBrian Somers {
2431fa665f5SBrian Somers int result;
2441fa665f5SBrian Somers
2451fa665f5SBrian Somers ID0set0();
2466f384573SBrian Somers result = connect(s, (const struct sockaddr *)name, sizeof *name);
247dd7e2610SBrian Somers log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n",
2483a2e4f62SBrian Somers result, s, name->sun_path, (int)sizeof(*name));
2491fa665f5SBrian Somers ID0setuser();
2501fa665f5SBrian Somers return result;
2511fa665f5SBrian Somers }
2528e7b8599SBrian Somers
2538e7b8599SBrian Somers int
ID0kill(pid_t pid,int sig)2548e7b8599SBrian Somers ID0kill(pid_t pid, int sig)
2558e7b8599SBrian Somers {
2568e7b8599SBrian Somers int result;
2578e7b8599SBrian Somers
2588e7b8599SBrian Somers ID0set0();
2598e7b8599SBrian Somers result = kill(pid, sig);
26042df3c25SBrian Somers log_Printf(LogID0, "%d = kill(%ld, %d)\n", result, (long)pid, sig);
2618e7b8599SBrian Somers ID0setuser();
2628e7b8599SBrian Somers return result;
2638e7b8599SBrian Somers }
264fc3034caSBrian Somers
265fdb4bb1bSBrian Somers #if defined(__FreeBSD__) && !defined(NOKLDLOAD)
266fc3034caSBrian Somers int
ID0kldload(const char * dev)267fc3034caSBrian Somers ID0kldload(const char *dev)
268fc3034caSBrian Somers {
269fc3034caSBrian Somers int result;
270fc3034caSBrian Somers
271fc3034caSBrian Somers ID0set0();
272fc3034caSBrian Somers result = kldload(dev);
273fc3034caSBrian Somers log_Printf(LogID0, "%d = kldload(\"%s\")\n", result, dev);
274fc3034caSBrian Somers ID0setuser();
275fc3034caSBrian Somers return result;
276fc3034caSBrian Somers }
277fc3034caSBrian Somers #endif
27831dd45c4SBrian Somers
27931dd45c4SBrian Somers #ifndef NONETGRAPH
28031dd45c4SBrian Somers int
ID0NgMkSockNode(const char * name,int * cs,int * ds)28131dd45c4SBrian Somers ID0NgMkSockNode(const char *name, int *cs, int *ds)
28231dd45c4SBrian Somers {
28331dd45c4SBrian Somers int result;
28431dd45c4SBrian Somers
28531dd45c4SBrian Somers ID0set0();
28631dd45c4SBrian Somers result = NgMkSockNode(name, cs, ds);
28731dd45c4SBrian Somers log_Printf(LogID0, "%d = NgMkSockNode(\"%s\", &cs, &ds)\n",
28831dd45c4SBrian Somers result, name ? name : "");
28931dd45c4SBrian Somers ID0setuser();
29031dd45c4SBrian Somers return result;
29131dd45c4SBrian Somers }
29231dd45c4SBrian Somers #endif
293