1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD$
29 */
30
31#include <sys/param.h>
32#include <sys/socket.h>
33#include <sys/un.h>
34
35#include <sys/ioctl.h>
36#include <fcntl.h>
37#ifndef NONETGRAPH
38#include <netgraph.h>
39#endif
40#include <signal.h>
41#include <stdarg.h>
42#include <stdio.h>
43#include <string.h>
44#include <sysexits.h>
45#if defined(__FreeBSD__) && !defined(NOKLDLOAD)
46#include <sys/linker.h>
47#endif
48#include <unistd.h>
49#ifdef __OpenBSD__
50#include <util.h>
51#else
52#include <libutil.h>
53#endif
54#include <utmpx.h>
55
56#include "log.h"
57#include "main.h"
58#include "id.h"
59
60static int uid;
61static int euid;
62
63void
64ID0init()
65{
66  uid = getuid();
67  euid = geteuid();
68}
69
70static void
71ID0setuser(void)
72{
73  if (seteuid(uid) == -1) {
74    log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n");
75    AbortProgram(EX_NOPERM);
76  }
77}
78
79uid_t
80ID0realuid()
81{
82  return uid;
83}
84
85static void
86ID0set0(void)
87{
88  if (seteuid(euid) == -1) {
89    log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n");
90    AbortProgram(EX_NOPERM);
91  }
92}
93
94int
95ID0ioctl(int fd, unsigned long req, void *arg)
96{
97  int ret;
98
99  ID0set0();
100  ret = ioctl(fd, req, arg);
101  log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg);
102  ID0setuser();
103  return ret;
104}
105
106int
107ID0unlink(const char *name)
108{
109  int ret;
110
111  ID0set0();
112  ret = unlink(name);
113  log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name);
114  ID0setuser();
115  return ret;
116}
117
118int
119ID0socket(int domain, int type, int protocol)
120{
121  int ret;
122
123  ID0set0();
124  ret = socket(domain, type, protocol);
125  log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol);
126  ID0setuser();
127  return ret;
128}
129
130FILE *
131ID0fopen(const char *path, const char *mode)
132{
133  FILE *ret;
134
135  ID0set0();
136  ret = fopen(path, mode);
137  log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode);
138  ID0setuser();
139  return ret;
140}
141
142int
143ID0open(const char *path, int flags, ...)
144{
145  int ret;
146  va_list ap;
147
148  va_start(ap, flags);
149  ID0set0();
150  ret = open(path, flags, va_arg(ap, int));
151  log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags);
152  ID0setuser();
153  va_end(ap);
154  return ret;
155}
156
157int
158ID0write(int fd, const void *data, size_t len)
159{
160  int ret;
161
162  ID0set0();
163  ret = write(fd, data, len);
164  log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len);
165  ID0setuser();
166  return ret;
167}
168
169int
170ID0uu_lock(const char *basettyname)
171{
172  int ret;
173
174  ID0set0();
175  ret = uu_lock(basettyname);
176  log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname);
177  ID0setuser();
178  return ret;
179}
180
181int
182ID0uu_lock_txfr(const char *basettyname, pid_t newpid)
183{
184  int ret;
185
186  ID0set0();
187  ret = uu_lock_txfr(basettyname, newpid);
188  log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %ld)\n", ret, basettyname,
189             (long)newpid);
190  ID0setuser();
191  return ret;
192}
193
194int
195ID0uu_unlock(const char *basettyname)
196{
197  int ret;
198
199  ID0set0();
200  ret = uu_unlock(basettyname);
201  log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname);
202  ID0setuser();
203  return ret;
204}
205
206void
207ID0login(const struct utmpx *ut)
208{
209  ID0set0();
210  pututxline(ut);
211  log_Printf(LogID0, "pututxline(\"%.*s\", \"%.*s\", \"%.*s\", \"%.*s\")\n",
212      (int)sizeof ut->ut_id, ut->ut_id,
213      (int)sizeof ut->ut_user, ut->ut_user,
214      (int)sizeof ut->ut_line, ut->ut_line,
215      (int)sizeof ut->ut_host, ut->ut_host);
216  ID0setuser();
217}
218
219void
220ID0logout(const struct utmpx *ut)
221{
222  ID0set0();
223  pututxline(ut);
224  log_Printf(LogID0, "pututxline(\"%.*s\")\n",
225      (int)sizeof ut->ut_id, ut->ut_id);
226  ID0setuser();
227}
228
229int
230ID0bind_un(int s, const struct sockaddr_un *name)
231{
232  int result;
233
234  ID0set0();
235  result = bind(s, (const struct sockaddr *)name, sizeof *name);
236  log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n",
237            result, s, name->sun_path, (int)sizeof(*name));
238  ID0setuser();
239  return result;
240}
241
242int
243ID0connect_un(int s, const struct sockaddr_un *name)
244{
245  int result;
246
247  ID0set0();
248  result = connect(s, (const struct sockaddr *)name, sizeof *name);
249  log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n",
250            result, s, name->sun_path, (int)sizeof(*name));
251  ID0setuser();
252  return result;
253}
254
255int
256ID0kill(pid_t pid, int sig)
257{
258  int result;
259
260  ID0set0();
261  result = kill(pid, sig);
262  log_Printf(LogID0, "%d = kill(%ld, %d)\n", result, (long)pid, sig);
263  ID0setuser();
264  return result;
265}
266
267#if defined(__FreeBSD__) && !defined(NOKLDLOAD)
268int
269ID0kldload(const char *dev)
270{
271  int result;
272
273  ID0set0();
274  result = kldload(dev);
275  log_Printf(LogID0, "%d = kldload(\"%s\")\n", result, dev);
276  ID0setuser();
277  return result;
278}
279#endif
280
281#ifndef NONETGRAPH
282int
283ID0NgMkSockNode(const char *name, int *cs, int *ds)
284{
285  int result;
286
287  ID0set0();
288  result = NgMkSockNode(name, cs, ds);
289  log_Printf(LogID0, "%d = NgMkSockNode(\"%s\", &cs, &ds)\n",
290             result, name ? name : "");
291  ID0setuser();
292  return result;
293}
294#endif
295