xref: /freebsd/usr.sbin/ppp/id.c (revision de7453bb2a807a740cfef14b2a2df471fd9aa588)
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  *
26de7453bbSBrian Somers  *	$Id: id.c,v 1.4 1997/12/21 12:11:05 brian Exp $
275106c671SBrian Somers  */
285106c671SBrian Somers 
295106c671SBrian Somers #include <sys/types.h>
305106c671SBrian Somers #include <sys/socket.h>
315106c671SBrian Somers 
325106c671SBrian Somers #include <sys/ioctl.h>
335106c671SBrian Somers #include <fcntl.h>
345106c671SBrian Somers #include <stdio.h>
355106c671SBrian Somers #include <stdlib.h>
365106c671SBrian Somers #include <sysexits.h>
375106c671SBrian Somers #include <unistd.h>
385106c671SBrian Somers 
39b6e82f33SBrian Somers #include "command.h"
405106c671SBrian Somers #include "mbuf.h"
415106c671SBrian Somers #include "log.h"
425106c671SBrian Somers #include "main.h"
435106c671SBrian Somers #ifdef __OpenBSD__
445106c671SBrian Somers #include <util.h>
455106c671SBrian Somers #else
465106c671SBrian Somers #include <libutil.h>
475106c671SBrian Somers #endif
485106c671SBrian Somers #include "id.h"
495106c671SBrian Somers 
505106c671SBrian Somers static int uid;
515106c671SBrian Somers static int gid;
525106c671SBrian Somers static int euid;
535106c671SBrian Somers static int egid;
545106c671SBrian Somers 
555106c671SBrian Somers void
565106c671SBrian Somers ID0init()
575106c671SBrian Somers {
585106c671SBrian Somers   uid = getuid();
595106c671SBrian Somers   gid = getgid();
605106c671SBrian Somers   euid = geteuid();
615106c671SBrian Somers   egid = getegid();
625106c671SBrian Somers }
635106c671SBrian Somers 
645106c671SBrian Somers static void
65b6e82f33SBrian Somers ID0setuser(void)
665106c671SBrian Somers {
679fecb4e6SBrian Somers   if (seteuid(uid) == -1) {
689fecb4e6SBrian Somers     LogPrintf(LogERROR, "ID0setuser: Unable to seteuid!\n");
695106c671SBrian Somers     Cleanup(EX_NOPERM);
705106c671SBrian Somers   }
715106c671SBrian Somers }
725106c671SBrian Somers 
735106c671SBrian Somers uid_t
745106c671SBrian Somers ID0realuid()
755106c671SBrian Somers {
765106c671SBrian Somers   return uid;
775106c671SBrian Somers }
785106c671SBrian Somers 
795106c671SBrian Somers static void
80b6e82f33SBrian Somers ID0set0(void)
815106c671SBrian Somers {
829fecb4e6SBrian Somers   if (seteuid(euid) == -1) {
839fecb4e6SBrian Somers     LogPrintf(LogERROR, "ID0set0: Unable to seteuid!\n");
845106c671SBrian Somers     Cleanup(EX_NOPERM);
855106c671SBrian Somers   }
865106c671SBrian Somers }
875106c671SBrian Somers 
885106c671SBrian Somers int
895106c671SBrian Somers ID0ioctl(int fd, unsigned long req, void *arg)
905106c671SBrian Somers {
915106c671SBrian Somers   int ret;
925106c671SBrian Somers 
935106c671SBrian Somers   ID0set0();
945106c671SBrian Somers   ret = ioctl(fd, req, arg);
955106c671SBrian Somers   LogPrintf(LogID0, "%d = ioctl(%d, %d, %p)\n", ret, fd, req, arg);
965106c671SBrian Somers   ID0setuser();
975106c671SBrian Somers   return ret;
985106c671SBrian Somers }
995106c671SBrian Somers 
1005106c671SBrian Somers int
1015106c671SBrian Somers ID0unlink(const char *name)
1025106c671SBrian Somers {
1035106c671SBrian Somers   int ret;
1045106c671SBrian Somers 
1055106c671SBrian Somers   ID0set0();
1065106c671SBrian Somers   ret = unlink(name);
1075106c671SBrian Somers   LogPrintf(LogID0, "%d = unlink(\"%s\")\n", ret, name);
1085106c671SBrian Somers   ID0setuser();
1095106c671SBrian Somers   return ret;
1105106c671SBrian Somers }
1115106c671SBrian Somers 
1125106c671SBrian Somers int
1135106c671SBrian Somers ID0socket(int domain, int type, int protocol)
1145106c671SBrian Somers {
1155106c671SBrian Somers   int ret;
1165106c671SBrian Somers 
1175106c671SBrian Somers   ID0set0();
1185106c671SBrian Somers   ret = socket(domain, type, protocol);
1195106c671SBrian Somers   LogPrintf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol);
1205106c671SBrian Somers   ID0setuser();
1215106c671SBrian Somers   return ret;
1225106c671SBrian Somers }
1235106c671SBrian Somers 
1245106c671SBrian Somers FILE *
1255106c671SBrian Somers ID0fopen(const char *path, const char *mode)
1265106c671SBrian Somers {
1275106c671SBrian Somers   FILE *ret;
1285106c671SBrian Somers 
1295106c671SBrian Somers   ID0set0();
1305106c671SBrian Somers   ret = fopen(path, mode);
1315106c671SBrian Somers   LogPrintf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode);
1325106c671SBrian Somers   ID0setuser();
1335106c671SBrian Somers   return ret;
1345106c671SBrian Somers }
1355106c671SBrian Somers 
1365106c671SBrian Somers int
1375106c671SBrian Somers ID0open(const char *path, int flags)
1385106c671SBrian Somers {
1395106c671SBrian Somers   int ret;
1405106c671SBrian Somers 
1415106c671SBrian Somers   ID0set0();
1425106c671SBrian Somers   ret = open(path, flags);
1435106c671SBrian Somers   LogPrintf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags);
1445106c671SBrian Somers   ID0setuser();
1455106c671SBrian Somers   return ret;
1465106c671SBrian Somers }
1475106c671SBrian Somers 
1485106c671SBrian Somers int
149de7453bbSBrian Somers ID0write(int fd, const void *data, size_t len)
150de7453bbSBrian Somers {
151de7453bbSBrian Somers   int ret;
152de7453bbSBrian Somers 
153de7453bbSBrian Somers   ID0set0();
154de7453bbSBrian Somers   ret = write(fd, data, len);
155de7453bbSBrian Somers   LogPrintf(LogID0, "%d = write(%d, data, %d)\n", ret, fd, len);
156de7453bbSBrian Somers   ID0setuser();
157de7453bbSBrian Somers   return ret;
158de7453bbSBrian Somers }
159de7453bbSBrian Somers 
160de7453bbSBrian Somers int
161b6e82f33SBrian Somers ID0uu_lock(const char *basettyname)
1625106c671SBrian Somers {
1635106c671SBrian Somers   int ret;
1645106c671SBrian Somers 
1655106c671SBrian Somers   ID0set0();
166b6e82f33SBrian Somers   ret = uu_lock(basettyname);
167b6e82f33SBrian Somers   LogPrintf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname);
1685106c671SBrian Somers   ID0setuser();
1695106c671SBrian Somers   return ret;
1705106c671SBrian Somers }
1715106c671SBrian Somers 
1725106c671SBrian Somers int
173b6e82f33SBrian Somers ID0uu_unlock(const char *basettyname)
1745106c671SBrian Somers {
1755106c671SBrian Somers   int ret;
1765106c671SBrian Somers 
1775106c671SBrian Somers   ID0set0();
178b6e82f33SBrian Somers   ret = uu_unlock(basettyname);
179b6e82f33SBrian Somers   LogPrintf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname);
1805106c671SBrian Somers   ID0setuser();
1815106c671SBrian Somers   return ret;
1825106c671SBrian Somers }
183