131921Sbrian/*-
231921Sbrian * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
331921Sbrian * All rights reserved.
431921Sbrian *
531921Sbrian * Redistribution and use in source and binary forms, with or without
631921Sbrian * modification, are permitted provided that the following conditions
731921Sbrian * are met:
831921Sbrian * 1. Redistributions of source code must retain the above copyright
931921Sbrian *    notice, this list of conditions and the following disclaimer.
1031921Sbrian * 2. Redistributions in binary form must reproduce the above copyright
1131921Sbrian *    notice, this list of conditions and the following disclaimer in the
1231921Sbrian *    documentation and/or other materials provided with the distribution.
1331921Sbrian *
1431921Sbrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1531921Sbrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1631921Sbrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1731921Sbrian * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1831921Sbrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1931921Sbrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2031921Sbrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2131921Sbrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2231921Sbrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2331921Sbrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2431921Sbrian * SUCH DAMAGE.
2531921Sbrian *
2650479Speter * $FreeBSD$
2731061Sbrian */
2831061Sbrian
2951525Sbrian#include <sys/param.h>
3031061Sbrian#include <sys/socket.h>
3136285Sbrian#include <sys/un.h>
3231061Sbrian
3331061Sbrian#include <sys/ioctl.h>
3431061Sbrian#include <fcntl.h>
3553535Sbrian#ifndef NONETGRAPH
3653535Sbrian#include <netgraph.h>
3753535Sbrian#endif
3836467Sbrian#include <signal.h>
3936285Sbrian#include <stdarg.h>
4031061Sbrian#include <stdio.h>
4133603Sbrian#include <string.h>
4231061Sbrian#include <sysexits.h>
4351525Sbrian#if defined(__FreeBSD__) && !defined(NOKLDLOAD)
4451525Sbrian#include <sys/linker.h>
4551525Sbrian#endif
4631061Sbrian#include <unistd.h>
4733603Sbrian#ifdef __OpenBSD__
4833603Sbrian#include <util.h>
4933603Sbrian#else
5033603Sbrian#include <libutil.h>
5133603Sbrian#endif
52202192Sed#include <utmpx.h>
5331061Sbrian
5431061Sbrian#include "log.h"
5531061Sbrian#include "main.h"
5631061Sbrian#include "id.h"
5731061Sbrian
5831061Sbrianstatic int uid;
5931061Sbrianstatic int euid;
6031061Sbrian
6131061Sbrianvoid
6231061SbrianID0init()
6331061Sbrian{
6431061Sbrian  uid = getuid();
6531061Sbrian  euid = geteuid();
6631061Sbrian}
6731061Sbrian
6831061Sbrianstatic void
6931343SbrianID0setuser(void)
7031061Sbrian{
7131159Sbrian  if (seteuid(uid) == -1) {
7236285Sbrian    log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n");
7336285Sbrian    AbortProgram(EX_NOPERM);
7431061Sbrian  }
7531061Sbrian}
7631061Sbrian
7731061Sbrianuid_t
7831061SbrianID0realuid()
7931061Sbrian{
8031061Sbrian  return uid;
8131061Sbrian}
8231061Sbrian
8331061Sbrianstatic void
8431343SbrianID0set0(void)
8531061Sbrian{
8631159Sbrian  if (seteuid(euid) == -1) {
8736285Sbrian    log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n");
8836285Sbrian    AbortProgram(EX_NOPERM);
8931061Sbrian  }
9031061Sbrian}
9131061Sbrian
9231061Sbrianint
9331061SbrianID0ioctl(int fd, unsigned long req, void *arg)
9431061Sbrian{
9531061Sbrian  int ret;
9631061Sbrian
9731061Sbrian  ID0set0();
9831061Sbrian  ret = ioctl(fd, req, arg);
9936285Sbrian  log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg);
10031061Sbrian  ID0setuser();
10131061Sbrian  return ret;
10231061Sbrian}
10331061Sbrian
10431061Sbrianint
10531061SbrianID0unlink(const char *name)
10631061Sbrian{
10731061Sbrian  int ret;
10831061Sbrian
10931061Sbrian  ID0set0();
11031061Sbrian  ret = unlink(name);
11136285Sbrian  log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name);
11231061Sbrian  ID0setuser();
11331061Sbrian  return ret;
11431061Sbrian}
11531061Sbrian
11631061Sbrianint
11731061SbrianID0socket(int domain, int type, int protocol)
11831061Sbrian{
11931061Sbrian  int ret;
12031061Sbrian
12131061Sbrian  ID0set0();
12231061Sbrian  ret = socket(domain, type, protocol);
12336285Sbrian  log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol);
12431061Sbrian  ID0setuser();
12531061Sbrian  return ret;
12631061Sbrian}
12731061Sbrian
12831061SbrianFILE *
12931061SbrianID0fopen(const char *path, const char *mode)
13031061Sbrian{
13131061Sbrian  FILE *ret;
13231061Sbrian
13331061Sbrian  ID0set0();
13431061Sbrian  ret = fopen(path, mode);
13536285Sbrian  log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode);
13631061Sbrian  ID0setuser();
13731061Sbrian  return ret;
13831061Sbrian}
13931061Sbrian
14031061Sbrianint
14136285SbrianID0open(const char *path, int flags, ...)
14231061Sbrian{
14331061Sbrian  int ret;
14436285Sbrian  va_list ap;
14531061Sbrian
14636285Sbrian  va_start(ap, flags);
14731061Sbrian  ID0set0();
14836285Sbrian  ret = open(path, flags, va_arg(ap, int));
14936285Sbrian  log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags);
15031061Sbrian  ID0setuser();
15136285Sbrian  va_end(ap);
15231061Sbrian  return ret;
15331061Sbrian}
15431061Sbrian
15531061Sbrianint
15632025SbrianID0write(int fd, const void *data, size_t len)
15732025Sbrian{
15832025Sbrian  int ret;
15932025Sbrian
16032025Sbrian  ID0set0();
16132025Sbrian  ret = write(fd, data, len);
16237210Sbrian  log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len);
16332025Sbrian  ID0setuser();
16432025Sbrian  return ret;
16532025Sbrian}
16632025Sbrian
16732025Sbrianint
16831343SbrianID0uu_lock(const char *basettyname)
16931061Sbrian{
17031061Sbrian  int ret;
17131061Sbrian
17231061Sbrian  ID0set0();
17331343Sbrian  ret = uu_lock(basettyname);
17436285Sbrian  log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname);
17531061Sbrian  ID0setuser();
17631061Sbrian  return ret;
17731061Sbrian}
17831061Sbrian
17931061Sbrianint
18036450SbrianID0uu_lock_txfr(const char *basettyname, pid_t newpid)
18136450Sbrian{
18236450Sbrian  int ret;
18336450Sbrian
18436450Sbrian  ID0set0();
18536450Sbrian  ret = uu_lock_txfr(basettyname, newpid);
18697360Sbrian  log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %ld)\n", ret, basettyname,
18797360Sbrian             (long)newpid);
18836450Sbrian  ID0setuser();
18936450Sbrian  return ret;
19036450Sbrian}
19136450Sbrian
19236450Sbrianint
19331343SbrianID0uu_unlock(const char *basettyname)
19431061Sbrian{
19531061Sbrian  int ret;
19631061Sbrian
19731061Sbrian  ID0set0();
19831343Sbrian  ret = uu_unlock(basettyname);
19936285Sbrian  log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname);
20031061Sbrian  ID0setuser();
20131061Sbrian  return ret;
20231061Sbrian}
20333603Sbrian
20433603Sbrianvoid
205202192SedID0login(const struct utmpx *ut)
20633603Sbrian{
20733603Sbrian  ID0set0();
208202192Sed  pututxline(ut);
209202192Sed  log_Printf(LogID0, "pututxline(\"%.*s\", \"%.*s\", \"%.*s\", \"%.*s\")\n",
210202192Sed      (int)sizeof ut->ut_id, ut->ut_id,
211202192Sed      (int)sizeof ut->ut_user, ut->ut_user,
212202192Sed      (int)sizeof ut->ut_line, ut->ut_line,
213202192Sed      (int)sizeof ut->ut_host, ut->ut_host);
21433603Sbrian  ID0setuser();
21533603Sbrian}
21633603Sbrian
21733603Sbrianvoid
218202192SedID0logout(const struct utmpx *ut)
21933603Sbrian{
22033603Sbrian  ID0set0();
221202192Sed  pututxline(ut);
222202192Sed  log_Printf(LogID0, "pututxline(\"%.*s\")\n",
223202192Sed      (int)sizeof ut->ut_id, ut->ut_id);
22433603Sbrian  ID0setuser();
22533603Sbrian}
22636285Sbrian
22736285Sbrianint
22836285SbrianID0bind_un(int s, const struct sockaddr_un *name)
22936285Sbrian{
23036285Sbrian  int result;
23136285Sbrian
23236285Sbrian  ID0set0();
23336285Sbrian  result = bind(s, (const struct sockaddr *)name, sizeof *name);
23436285Sbrian  log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n",
23537210Sbrian            result, s, name->sun_path, (int)sizeof(*name));
23636285Sbrian  ID0setuser();
23736285Sbrian  return result;
23836285Sbrian}
23936285Sbrian
24036285Sbrianint
24136285SbrianID0connect_un(int s, const struct sockaddr_un *name)
24236285Sbrian{
24336285Sbrian  int result;
24436285Sbrian
24536285Sbrian  ID0set0();
24636285Sbrian  result = connect(s, (const struct sockaddr *)name, sizeof *name);
24736285Sbrian  log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n",
24837210Sbrian            result, s, name->sun_path, (int)sizeof(*name));
24936285Sbrian  ID0setuser();
25036285Sbrian  return result;
25136285Sbrian}
25236467Sbrian
25336467Sbrianint
25436467SbrianID0kill(pid_t pid, int sig)
25536467Sbrian{
25636467Sbrian  int result;
25736467Sbrian
25836467Sbrian  ID0set0();
25936467Sbrian  result = kill(pid, sig);
26097360Sbrian  log_Printf(LogID0, "%d = kill(%ld, %d)\n", result, (long)pid, sig);
26136467Sbrian  ID0setuser();
26236467Sbrian  return result;
26336467Sbrian}
26451525Sbrian
26553241Sbrian#if defined(__FreeBSD__) && !defined(NOKLDLOAD)
26651525Sbrianint
26751525SbrianID0kldload(const char *dev)
26851525Sbrian{
26951525Sbrian  int result;
27051525Sbrian
27151525Sbrian  ID0set0();
27251525Sbrian  result = kldload(dev);
27351525Sbrian  log_Printf(LogID0, "%d = kldload(\"%s\")\n", result, dev);
27451525Sbrian  ID0setuser();
27551525Sbrian  return result;
27651525Sbrian}
27751525Sbrian#endif
27853535Sbrian
27953535Sbrian#ifndef NONETGRAPH
28053535Sbrianint
28153535SbrianID0NgMkSockNode(const char *name, int *cs, int *ds)
28253535Sbrian{
28353535Sbrian  int result;
28453535Sbrian
28553535Sbrian  ID0set0();
28653535Sbrian  result = NgMkSockNode(name, cs, ds);
28753535Sbrian  log_Printf(LogID0, "%d = NgMkSockNode(\"%s\", &cs, &ds)\n",
28853535Sbrian             result, name ? name : "");
28953535Sbrian  ID0setuser();
29053535Sbrian  return result;
29153535Sbrian}
29253535Sbrian#endif
293