xref: /freebsd/usr.sbin/ppp/id.c (revision 8e7b85992bdc9c53b3d419fd9e50783447e75dbe)
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  *
268e7b8599SBrian Somers  *	$Id: id.c,v 1.9 1998/05/28 23:15:36 brian Exp $
275106c671SBrian Somers  */
285106c671SBrian Somers 
295106c671SBrian Somers #include <sys/types.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>
358e7b8599SBrian Somers #include <signal.h>
363edeb0c6SBrian Somers #include <stdarg.h>
375106c671SBrian Somers #include <stdio.h>
3845ad566fSBrian Somers #include <string.h>
395106c671SBrian Somers #include <sysexits.h>
405106c671SBrian Somers #include <unistd.h>
415106c671SBrian Somers #ifdef __OpenBSD__
425106c671SBrian Somers #include <util.h>
435106c671SBrian Somers #else
445106c671SBrian Somers #include <libutil.h>
455106c671SBrian Somers #endif
4645ad566fSBrian Somers #include <utmp.h>
4745ad566fSBrian Somers 
4845ad566fSBrian Somers #include "log.h"
4945ad566fSBrian Somers #include "main.h"
505106c671SBrian Somers #include "id.h"
515106c671SBrian Somers 
525106c671SBrian Somers static int uid;
535106c671SBrian Somers static int euid;
545106c671SBrian Somers 
555106c671SBrian Somers void
565106c671SBrian Somers ID0init()
575106c671SBrian Somers {
585106c671SBrian Somers   uid = getuid();
595106c671SBrian Somers   euid = geteuid();
605106c671SBrian Somers }
615106c671SBrian Somers 
625106c671SBrian Somers static void
63b6e82f33SBrian Somers ID0setuser(void)
645106c671SBrian Somers {
659fecb4e6SBrian Somers   if (seteuid(uid) == -1) {
66dd7e2610SBrian Somers     log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n");
671afedc4bSBrian Somers     AbortProgram(EX_NOPERM);
685106c671SBrian Somers   }
695106c671SBrian Somers }
705106c671SBrian Somers 
715106c671SBrian Somers uid_t
725106c671SBrian Somers ID0realuid()
735106c671SBrian Somers {
745106c671SBrian Somers   return uid;
755106c671SBrian Somers }
765106c671SBrian Somers 
775106c671SBrian Somers static void
78b6e82f33SBrian Somers ID0set0(void)
795106c671SBrian Somers {
809fecb4e6SBrian Somers   if (seteuid(euid) == -1) {
81dd7e2610SBrian Somers     log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n");
821afedc4bSBrian Somers     AbortProgram(EX_NOPERM);
835106c671SBrian Somers   }
845106c671SBrian Somers }
855106c671SBrian Somers 
865106c671SBrian Somers int
875106c671SBrian Somers ID0ioctl(int fd, unsigned long req, void *arg)
885106c671SBrian Somers {
895106c671SBrian Somers   int ret;
905106c671SBrian Somers 
915106c671SBrian Somers   ID0set0();
925106c671SBrian Somers   ret = ioctl(fd, req, arg);
93dd7e2610SBrian Somers   log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg);
945106c671SBrian Somers   ID0setuser();
955106c671SBrian Somers   return ret;
965106c671SBrian Somers }
975106c671SBrian Somers 
985106c671SBrian Somers int
995106c671SBrian Somers ID0unlink(const char *name)
1005106c671SBrian Somers {
1015106c671SBrian Somers   int ret;
1025106c671SBrian Somers 
1035106c671SBrian Somers   ID0set0();
1045106c671SBrian Somers   ret = unlink(name);
105dd7e2610SBrian Somers   log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name);
1065106c671SBrian Somers   ID0setuser();
1075106c671SBrian Somers   return ret;
1085106c671SBrian Somers }
1095106c671SBrian Somers 
1105106c671SBrian Somers int
1115106c671SBrian Somers ID0socket(int domain, int type, int protocol)
1125106c671SBrian Somers {
1135106c671SBrian Somers   int ret;
1145106c671SBrian Somers 
1155106c671SBrian Somers   ID0set0();
1165106c671SBrian Somers   ret = socket(domain, type, protocol);
117dd7e2610SBrian Somers   log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol);
1185106c671SBrian Somers   ID0setuser();
1195106c671SBrian Somers   return ret;
1205106c671SBrian Somers }
1215106c671SBrian Somers 
1225106c671SBrian Somers FILE *
1235106c671SBrian Somers ID0fopen(const char *path, const char *mode)
1245106c671SBrian Somers {
1255106c671SBrian Somers   FILE *ret;
1265106c671SBrian Somers 
1275106c671SBrian Somers   ID0set0();
1285106c671SBrian Somers   ret = fopen(path, mode);
129dd7e2610SBrian Somers   log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode);
1305106c671SBrian Somers   ID0setuser();
1315106c671SBrian Somers   return ret;
1325106c671SBrian Somers }
1335106c671SBrian Somers 
1345106c671SBrian Somers int
1353edeb0c6SBrian Somers ID0open(const char *path, int flags, ...)
1365106c671SBrian Somers {
1375106c671SBrian Somers   int ret;
1383edeb0c6SBrian Somers   va_list ap;
1395106c671SBrian Somers 
1403edeb0c6SBrian Somers   va_start(ap, flags);
1415106c671SBrian Somers   ID0set0();
1423edeb0c6SBrian Somers   ret = open(path, flags, va_arg(ap, int));
143dd7e2610SBrian Somers   log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags);
1445106c671SBrian Somers   ID0setuser();
1453edeb0c6SBrian Somers   va_end(ap);
1465106c671SBrian Somers   return ret;
1475106c671SBrian Somers }
1485106c671SBrian Somers 
1495106c671SBrian Somers int
150de7453bbSBrian Somers ID0write(int fd, const void *data, size_t len)
151de7453bbSBrian Somers {
152de7453bbSBrian Somers   int ret;
153de7453bbSBrian Somers 
154de7453bbSBrian Somers   ID0set0();
155de7453bbSBrian Somers   ret = write(fd, data, len);
156dd7e2610SBrian Somers   log_Printf(LogID0, "%d = write(%d, data, %d)\n", ret, fd, len);
157de7453bbSBrian Somers   ID0setuser();
158de7453bbSBrian Somers   return ret;
159de7453bbSBrian Somers }
160de7453bbSBrian Somers 
161de7453bbSBrian Somers int
162b6e82f33SBrian Somers ID0uu_lock(const char *basettyname)
1635106c671SBrian Somers {
1645106c671SBrian Somers   int ret;
1655106c671SBrian Somers 
1665106c671SBrian Somers   ID0set0();
167b6e82f33SBrian Somers   ret = uu_lock(basettyname);
168dd7e2610SBrian Somers   log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname);
1695106c671SBrian Somers   ID0setuser();
1705106c671SBrian Somers   return ret;
1715106c671SBrian Somers }
1725106c671SBrian Somers 
1735106c671SBrian Somers int
17485fd273aSBrian Somers ID0uu_lock_txfr(const char *basettyname, pid_t newpid)
17585fd273aSBrian Somers {
17685fd273aSBrian Somers   int ret;
17785fd273aSBrian Somers 
17885fd273aSBrian Somers   ID0set0();
17985fd273aSBrian Somers   ret = uu_lock_txfr(basettyname, newpid);
18085fd273aSBrian Somers   log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %d)\n", ret, basettyname,
18185fd273aSBrian Somers              (int)newpid);
18285fd273aSBrian Somers   ID0setuser();
18385fd273aSBrian Somers   return ret;
18485fd273aSBrian Somers }
18585fd273aSBrian Somers 
18685fd273aSBrian Somers int
187b6e82f33SBrian Somers ID0uu_unlock(const char *basettyname)
1885106c671SBrian Somers {
1895106c671SBrian Somers   int ret;
1905106c671SBrian Somers 
1915106c671SBrian Somers   ID0set0();
192b6e82f33SBrian Somers   ret = uu_unlock(basettyname);
193dd7e2610SBrian Somers   log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname);
1945106c671SBrian Somers   ID0setuser();
1955106c671SBrian Somers   return ret;
1965106c671SBrian Somers }
19745ad566fSBrian Somers 
19845ad566fSBrian Somers void
19945ad566fSBrian Somers ID0login(struct utmp *ut)
20045ad566fSBrian Somers {
20145ad566fSBrian Somers   ID0set0();
20245ad566fSBrian Somers   if (logout(ut->ut_line)) {
203dd7e2610SBrian Somers     log_Printf(LogID0, "logout(\"%s\")\n", ut->ut_line);
20445ad566fSBrian Somers     logwtmp(ut->ut_line, "", "");
205dd7e2610SBrian Somers     log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut->ut_line);
20645ad566fSBrian Somers   }
20745ad566fSBrian Somers   login(ut);
208dd7e2610SBrian Somers   log_Printf(LogID0, "login(\"%s\", \"%.*s\")\n",
209fe3125a0SBrian Somers             ut->ut_line, (int)(sizeof ut->ut_name), ut->ut_name);
21045ad566fSBrian Somers   ID0setuser();
21145ad566fSBrian Somers }
21245ad566fSBrian Somers 
21345ad566fSBrian Somers void
21445ad566fSBrian Somers ID0logout(const char *device)
21545ad566fSBrian Somers {
21645ad566fSBrian Somers   struct utmp ut;
21745ad566fSBrian Somers 
21845ad566fSBrian Somers   strncpy(ut.ut_line, device, sizeof ut.ut_line - 1);
21945ad566fSBrian Somers   ut.ut_line[sizeof ut.ut_line - 1] = '\0';
22045ad566fSBrian Somers 
22145ad566fSBrian Somers   ID0set0();
22245ad566fSBrian Somers   if (logout(ut.ut_line)) {
223dd7e2610SBrian Somers     log_Printf(LogID0, "logout(\"%s\")\n", ut.ut_line);
22445ad566fSBrian Somers     logwtmp(ut.ut_line, "", "");
225dd7e2610SBrian Somers     log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut.ut_line);
22645ad566fSBrian Somers   } else
227dd7e2610SBrian Somers     log_Printf(LogERROR, "ID0logout: No longer logged in on %s\n", ut.ut_line);
22845ad566fSBrian Somers   ID0setuser();
22945ad566fSBrian Somers }
2301fa665f5SBrian Somers 
2311fa665f5SBrian Somers int
2326f384573SBrian Somers ID0bind_un(int s, const struct sockaddr_un *name)
2331fa665f5SBrian Somers {
2341fa665f5SBrian Somers   int result;
2351fa665f5SBrian Somers 
2361fa665f5SBrian Somers   ID0set0();
2376f384573SBrian Somers   result = bind(s, (const struct sockaddr *)name, sizeof *name);
238dd7e2610SBrian Somers   log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n",
2396f384573SBrian Somers             result, s, name->sun_path, sizeof *name);
2401fa665f5SBrian Somers   ID0setuser();
2411fa665f5SBrian Somers   return result;
2421fa665f5SBrian Somers }
2431fa665f5SBrian Somers 
2441fa665f5SBrian Somers int
2456f384573SBrian Somers ID0connect_un(int s, const struct sockaddr_un *name)
2461fa665f5SBrian Somers {
2471fa665f5SBrian Somers   int result;
2481fa665f5SBrian Somers 
2491fa665f5SBrian Somers   ID0set0();
2506f384573SBrian Somers   result = connect(s, (const struct sockaddr *)name, sizeof *name);
251dd7e2610SBrian Somers   log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n",
2526f384573SBrian Somers             result, s, name->sun_path, sizeof *name);
2531fa665f5SBrian Somers   ID0setuser();
2541fa665f5SBrian Somers   return result;
2551fa665f5SBrian Somers }
2568e7b8599SBrian Somers 
2578e7b8599SBrian Somers int
2588e7b8599SBrian Somers ID0kill(pid_t pid, int sig)
2598e7b8599SBrian Somers {
2608e7b8599SBrian Somers   int result;
2618e7b8599SBrian Somers 
2628e7b8599SBrian Somers   ID0set0();
2638e7b8599SBrian Somers   result = kill(pid, sig);
2648e7b8599SBrian Somers   log_Printf(LogID0, "%d = kill(%d, %d)\n", result, (int)pid, sig);
2658e7b8599SBrian Somers   ID0setuser();
2668e7b8599SBrian Somers   return result;
2678e7b8599SBrian Somers }
268