"Fossies" - the Fresh Open Source Software Archive 
Member "ident2-v1.07_FINAL/sys/m_linux.c" (22 Jul 2005, 3169 Bytes) of package /linux/privat/old/ident2-v1.07_FINAL.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "m_linux.c" see the
Fossies "Dox" file reference documentation.
1 /*
2 * Ident-2 - an Identity server for UNIX
3 * Copyright (C) 1998-2001 Michael Bacarella
4 * Copyright (C) 2003 Netgraft Corporation
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 *
20 * Please view the file README for program information.
21 */
22
23 /*
24 * Support for Linux machine dependancies
25 */
26
27 #include "ident2.h"
28
29 #define PID_FILE "/var/run/ident2.pid"
30
31 /**
32 ** drop to the lowest permission level
33 ** possible. 'nobody' is ideal for linux
34 **/
35 int
36 m_reduce_rights (void)
37 {
38 struct passwd *pw;
39
40 if ((geteuid() && getuid())
41 || Dont_Change_Uid == TRUE)
42 return 0;
43
44 if ((pw = getpwnam ("nobody")) == NULL) {
45 syslog (LOG_ERR, "error: getpwnam(nobody): %s",
46 strerror (errno));
47 return -1;
48 }
49 if (setuid (pw->pw_uid) == -1) {
50 syslog (LOG_ERR, "error: setuid(%d): %s",
51 pw->pw_uid, strerror (errno));
52 return -1;
53 }
54 return 0;
55 }
56
57
58 /**
59 ** find what user belongs to the connection
60 ** described by LPORT, RPORT, RADDR, and LADDR.
61 ** return the uid.
62 **/
63 int
64 m_get_uid (struct in_addr *laddr, u_short lp,
65 struct in_addr *raddr, u_short rp)
66 {
67 FILE *fp;
68 char buf[150];
69
70 if ((fp = fopen ("/proc/net/tcp", "r")) == NULL) {
71 syslog (LOG_ERR, "error reading /proc/net/tcp: %s",
72 strerror (errno));
73 return -1;
74 }
75
76 fgets (buf, 149, fp); /* eat header!)*$ */
77
78 while (fgets (buf, 149, fp)) {
79 unsigned long local_addr, remote_addr;
80 unsigned long tx_queue, rx_queue, tm_when;
81 int sl, uid, retrnsmt, st, tr, local_port, remote_port;
82
83 if (sscanf (buf, "%d: %lX:%x %lX:%x %x %lX:%lX %x:%lX %x %d",
84
85 &sl, &local_addr, &local_port, &remote_addr,
86 &remote_port, &st, &tx_queue, &rx_queue,
87 &tr, &tm_when, &retrnsmt, &uid) == 12) {
88
89 if (lp == local_port && rp == remote_port
90 && remote_addr == raddr->s_addr) {
91 if (laddr == NULL) {
92 fclose (fp);
93 return uid;
94 }
95 else if (laddr->s_addr
96 == local_addr) {
97 fclose (fp);
98 return uid;
99 }
100 }
101 }
102 }
103 fclose (fp);
104 return -1;
105 }
106
107 /*
108 * records the pid for service management purposes.
109 * example: under Red Hat,Debian,etc pid is written to
110 * /var/run/identd.pid
111 * PID support suggested (and previously implemented)
112 * by Alexander Reelsen.
113 */
114 int
115 m_register_pid (void)
116 {
117 #ifdef HAS_VAR_RUN
118 FILE *fp;
119
120 if ((fp = fopen (PID_FILE, "w")) == NULL) {
121 syslog (LOG_WARNING, "couldn't record pid in %s: %s -- "
122 "automatic shutdown with system not available",
123 PID_FILE, strerror (errno));
124 return -1;
125 }
126 fprintf (fp, "%u\n", getpid ());
127 fclose (fp);
128 #endif
129 return 0;
130 }