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