xref: /freebsd/usr.sbin/ppp/id.c (revision 672eba2435eef4d20306e439169ed826a07c94bd)
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