"Fossies" - the Fresh Open Source Software Archive 
Member "portfwd-0.29/src/util.cc" (30 May 2005, 3303 Bytes) of package /linux/privat/old/portfwd-0.29.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.
1 /*
2 util.c
3
4 $Id: util.cc,v 1.11 2005/05/30 02:13:28 evertonm Exp $
5 */
6
7 #include <stdarg.h>
8 #include <string.h>
9 #include <time.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include <sys/ioctl.h>
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #include <fcntl.h>
16 #include <sys/time.h>
17 #include <sys/resource.h>
18 #include <sys/file.h>
19 #include <sys/socket.h>
20 #include <errno.h>
21 #include <stdio.h>
22 #include <syslog.h>
23 #include <stdlib.h>
24
25 #include "util.h"
26
27 /* Solaris */
28 #ifdef HAVE_SYS_TERMIOS_H
29 #include <sys/termios.h>
30 #endif
31
32 int verbose_mode = 0; /* See ONVERBOSE in util.h */
33
34 const char *prog_name = 0;
35
36 void set_prog_name(const char *name)
37 {
38 prog_name = name;
39 }
40
41 const char *get_prog_name()
42 {
43 return prog_name ? prog_name : "?";
44 }
45
46 char* safe_strdup(const char* str)
47 {
48 const char* fmt = "%s: %s\n";
49 const char* func = "safe_strdup";
50
51 if (!str) {
52 syslog(LOG_EMERG, fmt, func, "null string pointer");
53 exit(1);
54 }
55 char* s = strdup(str);
56 if (!s) {
57 syslog(LOG_EMERG, fmt, func, "could not allocate string");
58 exit(1);
59 }
60
61 return s;
62 }
63
64 void safe_strcpy(char *trg, const char *src, int trg_buf_size)
65 {
66 for (char *past_end = trg + trg_buf_size - 1; trg < past_end; ++src, ++trg)
67 {
68 char c = *src;
69 *trg = c;
70 if (!c)
71 return;
72 }
73 *trg = '\0';
74 }
75
76 int cd_root() {
77
78 if (chdir("/") == -1) {
79 syslog(LOG_WARNING, "cd_root(): can't chdir to / (root): %m");
80 return -1;
81 }
82
83 return 0;
84 }
85
86 int std_to_null() {
87 /*
88 * Conecta stdin, stdout e stderr a /dev/null.
89 */
90 const char *dev_null = "/dev/null";
91 int fd = open(dev_null, O_RDWR);
92 if (fd) {
93 if (fd < 0)
94 syslog(LOG_ERR, "std_to_null(): error opening %s: %m", dev_null);
95 else
96 syslog(LOG_ERR, "std_to_null(): opening %s: expected fd 0, got %d", dev_null, fd);
97 return -1;
98 }
99
100 fd = dup(0);
101 if (fd != 1) {
102 if (fd < 0)
103 syslog(LOG_ERR, "std_to_null(): dup(0) failed: %m");
104 else
105 syslog(LOG_ERR, "std_to_null(): dup(0) expected fd 1, got %d", fd);
106 return -1;
107 }
108
109 fd = dup(0);
110 if (fd != 2) {
111 if (fd < 0)
112 syslog(LOG_ERR, "std_to_null(): dup(0) failed: %m");
113 else
114 syslog(LOG_ERR, "std_to_null(): dup(0) expected fd 2, got %d", fd);
115 return -1;
116 }
117
118 return 0;
119 }
120
121 int daemonize()
122 {
123 ONVERBOSE(syslog(LOG_INFO, "Daemonizing"));
124
125 /*
126 * Tenta desconectar terminal de controle.
127 */
128 const char *tty_path = "/dev/tty";
129 int tty = open(tty_path, O_NOCTTY);
130 if (tty == -1)
131 syslog(LOG_WARNING, "daemonize(): can't open tty: %s: %m", tty_path);
132 else {
133 if (ioctl(tty, TIOCNOTTY))
134 syslog(LOG_WARNING, "daemonize(): can't detach terminal: %m");
135 if (close(tty))
136 syslog(LOG_WARNING, "daemonize(): can't close tty: %s: %m", tty_path);
137 }
138
139 /*
140 * Garante que futuros open()s nao vao alocar um terminal de controle.
141 */
142 pid_t pid = fork();
143 if (pid) {
144 if (pid < 0) {
145 syslog(LOG_ERR, "daemonize(): fork() failed");
146 return -1;
147 }
148
149 /*
150 * Parent exits
151 */
152 exit(0);
153 }
154 /*
155 * Child proceeds
156 */
157
158 setsid();
159
160 return 0;
161 }
162
163 void socket_close(int fd)
164 {
165 DEBUGFD(syslog(LOG_DEBUG, "socket_close() on socket FD %d", fd));
166 if (close(fd))
167 syslog(LOG_ERR, "socket_close(): close() on socket FD %d failed: %m", fd);
168 }
169
170 /* eof: util.c */