aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-09-30 19:20:00 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-09-30 19:20:00 +0000
commit14c1940255a190143ef003a2a73bcba29e4c3d56 (patch)
treec53646ec260564f546562c980d912f78618544f7
parent1decd0e5292181284e403cd9ecf7abf39a5d7363 (diff)
downloadbusybox-w32-14c1940255a190143ef003a2a73bcba29e4c3d56.tar.gz
busybox-w32-14c1940255a190143ef003a2a73bcba29e4c3d56.tar.bz2
busybox-w32-14c1940255a190143ef003a2a73bcba29e4c3d56.zip
syslogd: getopt_ulflags'ification (save ~50 bytes)
-rw-r--r--sysklogd/syslogd.c299
1 files changed, 156 insertions, 143 deletions
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index a257e740e..a28dde6b3 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -23,13 +23,11 @@
23#include <sys/syslog.h> 23#include <sys/syslog.h>
24#include <sys/uio.h> 24#include <sys/uio.h>
25 25
26/* Path for the file where all log messages are written */
27#define __LOG_FILE "/var/log/messages"
28
29/* Path to the unix socket */ 26/* Path to the unix socket */
30static char lfile[MAXPATHLEN]; 27static char lfile[MAXPATHLEN];
31 28
32static const char *logFilePath = __LOG_FILE; 29/* Path for the file where all log messages are written */
30static const char *logFilePath = "/var/log/messages";
33 31
34#ifdef CONFIG_FEATURE_ROTATE_LOGFILE 32#ifdef CONFIG_FEATURE_ROTATE_LOGFILE
35/* max size of message file before being rotated */ 33/* max size of message file before being rotated */
@@ -63,15 +61,50 @@ static int RemotePort = 514;
63#endif 61#endif
64 62
65/* options */ 63/* options */
66static unsigned opts; 64static unsigned option_mask;
67#define SYSLOG_OPT_small (1) 65/* Correct regardless of combination of CONFIG_xxx */
68#define SYSLOG_OPT_remotelog (2) 66enum {
69#define SYSLOG_OPT_locallog (4) 67 OPTBIT_mark = 0, // -m
70#define SYSLOG_OPT_circularlog (8) 68 OPTBIT_nofork, // -n
69 OPTBIT_outfile, // -O
70 OPTBIT_loglevel, // -l
71 OPTBIT_small, // -S
72 USE_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize ,) // -s
73 USE_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt ,) // -b
74 USE_FEATURE_REMOTE_LOG( OPTBIT_remote ,) // -R
75 USE_FEATURE_REMOTE_LOG( OPTBIT_localtoo ,) // -L
76 USE_FEATURE_IPC_SYSLOG( OPTBIT_circularlog,) // -C
77
78 OPT_mark = 1 << OPTBIT_mark ,
79 OPT_nofork = 1 << OPTBIT_nofork ,
80 OPT_outfile = 1 << OPTBIT_outfile ,
81 OPT_loglevel = 1 << OPTBIT_loglevel,
82 OPT_small = 1 << OPTBIT_small ,
83 OPT_filesize = USE_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize )) + 0,
84 OPT_rotatecnt = USE_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt )) + 0,
85 OPT_remotelog = USE_FEATURE_REMOTE_LOG( (1 << OPTBIT_remote )) + 0,
86 OPT_locallog = USE_FEATURE_REMOTE_LOG( (1 << OPTBIT_localtoo )) + 0,
87 OPT_circularlog = USE_FEATURE_IPC_SYSLOG( (1 << OPTBIT_circularlog)) + 0,
88};
89#define OPTION_STR "m:nO:l:S" \
90 USE_FEATURE_ROTATE_LOGFILE("s:" ) \
91 USE_FEATURE_ROTATE_LOGFILE("b:" ) \
92 USE_FEATURE_REMOTE_LOG( "R:" ) \
93 USE_FEATURE_REMOTE_LOG( "L" ) \
94 USE_FEATURE_IPC_SYSLOG( "C::")
95#define OPTION_DECL *opt_m, *opt_l \
96 USE_FEATURE_ROTATE_LOGFILE(,*opt_s) \
97 USE_FEATURE_ROTATE_LOGFILE(,*opt_b) \
98 USE_FEATURE_REMOTE_LOG( ,*opt_R) \
99 USE_FEATURE_IPC_SYSLOG( ,*opt_C = NULL)
100#define OPTION_PARAM &opt_m, &logFilePath, &opt_l \
101 USE_FEATURE_ROTATE_LOGFILE(,&opt_s) \
102 USE_FEATURE_ROTATE_LOGFILE(,&opt_b) \
103 USE_FEATURE_REMOTE_LOG( ,&opt_R) \
104 USE_FEATURE_IPC_SYSLOG( ,&opt_C)
71 105
72#define MAXLINE 1024 /* maximum line length */ 106#define MAXLINE 1024 /* maximum line length */
73 107
74
75/* circular buffer variables/structures */ 108/* circular buffer variables/structures */
76#ifdef CONFIG_FEATURE_IPC_SYSLOG 109#ifdef CONFIG_FEATURE_IPC_SYSLOG
77 110
@@ -85,28 +118,28 @@ static unsigned opts;
85#include <sys/shm.h> 118#include <sys/shm.h>
86 119
87/* our shared key */ 120/* our shared key */
88static const long KEY_ID = 0x414e4547; /*"GENA" */ 121#define KEY_ID ((long)0x414e4547) /* "GENA" */
89 122
90// Semaphore operation structures 123// Semaphore operation structures
91static struct shbuf_ds { 124static struct shbuf_ds {
92 int size; // size of data written 125 int size; // size of data written
93 int head; // start of message list 126 int head; // start of message list
94 int tail; // end of message list 127 int tail; // end of message list
95 char data[1]; // data/messages 128 char data[1]; // data/messages
96} *buf = NULL; // shared memory pointer 129} *shbuf = NULL; // shared memory pointer
97 130
98static struct sembuf SMwup[1] = { {1, -1, IPC_NOWAIT} }; // set SMwup 131static struct sembuf SMwup[1] = { {1, -1, IPC_NOWAIT} }; // set SMwup
99static struct sembuf SMwdn[3] = { {0, 0}, {1, 0}, {1, +1} }; // set SMwdn 132static struct sembuf SMwdn[3] = { {0, 0}, {1, 0}, {1, +1} }; // set SMwdn
100 133
101static int shmid = -1; // ipc shared memory id 134static int shmid = -1; // ipc shared memory id
102static int s_semid = -1; // ipc semaphore id 135static int s_semid = -1; // ipc semaphore id
103static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size 136static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size
104 137
105static void ipcsyslog_cleanup(void) 138static void ipcsyslog_cleanup(void)
106{ 139{
107 printf("Exiting Syslogd!\n"); 140 puts("Exiting syslogd!");
108 if (shmid != -1) { 141 if (shmid != -1) {
109 shmdt(buf); 142 shmdt(shbuf);
110 } 143 }
111 144
112 if (shmid != -1) { 145 if (shmid != -1) {
@@ -119,22 +152,26 @@ static void ipcsyslog_cleanup(void)
119 152
120static void ipcsyslog_init(void) 153static void ipcsyslog_init(void)
121{ 154{
122 if (buf == NULL) { 155 if (shbuf == NULL) {
123 if ((shmid = shmget(KEY_ID, shm_size, IPC_CREAT | 1023)) == -1) { 156 shmid = shmget(KEY_ID, shm_size, IPC_CREAT | 1023);
157 if (shmid == -1) {
124 bb_perror_msg_and_die("shmget"); 158 bb_perror_msg_and_die("shmget");
125 } 159 }
126 160
127 if ((buf = shmat(shmid, NULL, 0)) == NULL) { 161 shbuf = shmat(shmid, NULL, 0);
162 if (!shbuf) {
128 bb_perror_msg_and_die("shmat"); 163 bb_perror_msg_and_die("shmat");
129 } 164 }
130 165
131 buf->size = shm_size - sizeof(*buf); 166 shbuf->size = shm_size - sizeof(*shbuf);
132 buf->head = buf->tail = 0; 167 shbuf->head = shbuf->tail = 0;
133 168
134 // we'll trust the OS to set initial semval to 0 (let's hope) 169 // we'll trust the OS to set initial semval to 0 (let's hope)
135 if ((s_semid = semget(KEY_ID, 2, IPC_CREAT | IPC_EXCL | 1023)) == -1) { 170 s_semid = semget(KEY_ID, 2, IPC_CREAT | IPC_EXCL | 1023);
171 if (s_semid == -1) {
136 if (errno == EEXIST) { 172 if (errno == EEXIST) {
137 if ((s_semid = semget(KEY_ID, 2, 0)) == -1) { 173 s_semid = semget(KEY_ID, 2, 0);
174 if (s_semid == -1) {
138 bb_perror_msg_and_die("semget"); 175 bb_perror_msg_and_die("semget");
139 } 176 }
140 } else { 177 } else {
@@ -179,69 +216,66 @@ static void circ_message(const char *msg)
179 * Note: This algorithm uses Linux IPC mechanism w/ shared memory and semaphores to provide 216 * Note: This algorithm uses Linux IPC mechanism w/ shared memory and semaphores to provide
180 * a threadsafe way of handling shared memory operations. 217 * a threadsafe way of handling shared memory operations.
181 */ 218 */
182 if ((buf->tail + l) < buf->size) { 219 if ((shbuf->tail + l) < shbuf->size) {
183 /* before we append the message we need to check the HEAD so that we won't 220 /* before we append the message we need to check the HEAD so that we won't
184 overwrite any of the message that we still need and adjust HEAD to point 221 overwrite any of the message that we still need and adjust HEAD to point
185 to the next message! */ 222 to the next message! */
186 if (buf->tail < buf->head) { 223 if (shbuf->tail < shbuf->head) {
187 if ((buf->tail + l) >= buf->head) { 224 if ((shbuf->tail + l) >= shbuf->head) {
188 /* we need to move the HEAD to point to the next message 225 /* we need to move the HEAD to point to the next message
189 * Theoretically we have enough room to add the whole message to the 226 * Theoretically we have enough room to add the whole message to the
190 * buffer, because of the first outer IF statement, so we don't have 227 * buffer, because of the first outer IF statement, so we don't have
191 * to worry about overflows here! 228 * to worry about overflows here!
192 */ 229 */
193 int k = buf->tail + l - buf->head; /* we need to know how many bytes 230 /* we need to know how many bytes we are overwriting to make enough room */
194 we are overwriting to make 231 int k = shbuf->tail + l - shbuf->head;
195 enough room */
196 char *c = 232 char *c =
197 memchr(buf->data + buf->head + k, '\0', 233 memchr(shbuf->data + shbuf->head + k, '\0',
198 buf->size - (buf->head + k)); 234 shbuf->size - (shbuf->head + k));
199 if (c != NULL) { /* do a sanity check just in case! */ 235 if (c != NULL) { /* do a sanity check just in case! */
200 buf->head = c - buf->data + 1; /* we need to convert pointer to 236 /* we need to convert pointer to offset + skip the '\0'
201 offset + skip the '\0' since 237 since we need to point to the beginning of the next message */
202 we need to point to the beginning 238 shbuf->head = c - shbuf->data + 1;
203 of the next message */
204 /* Note: HEAD is only used to "retrieve" messages, it's not used 239 /* Note: HEAD is only used to "retrieve" messages, it's not used
205 when writing messages into our buffer */ 240 when writing messages into our buffer */
206 } else { /* show an error message to know we messed up? */ 241 } else { /* show an error message to know we messed up? */
207 printf(fail_msg,""); 242 printf(fail_msg,"");
208 buf->head = 0; 243 shbuf->head = 0;
209 } 244 }
210 } 245 }
211 } 246 }
212 247
213 /* in other cases no overflows have been done yet, so we don't care! */ 248 /* in other cases no overflows have been done yet, so we don't care! */
214 /* we should be ok to append the message now */ 249 /* we should be ok to append the message now */
215 strncpy(buf->data + buf->tail, msg, l); /* append our message */ 250 strncpy(shbuf->data + shbuf->tail, msg, l); /* append our message */
216 buf->tail += l; /* count full message w/ '\0' terminating char */ 251 shbuf->tail += l; /* count full message w/ '\0' terminating char */
217 } else { 252 } else {
218 /* we need to break up the message and "circle" it around */ 253 /* we need to break up the message and "circle" it around */
219 char *c; 254 char *c;
220 int k = buf->tail + l - buf->size; /* count # of bytes we don't fit */ 255 int k = shbuf->tail + l - shbuf->size; /* count # of bytes we don't fit */
221 256
222 /* We need to move HEAD! This is always the case since we are going 257 /* We need to move HEAD! This is always the case since we are going
223 * to "circle" the message. 258 * to "circle" the message. */
224 */ 259 c = memchr(shbuf->data + k, '\0', shbuf->size - k);
225 c = memchr(buf->data + k, '\0', buf->size - k);
226 260
227 if (c != NULL) { /* if we don't have '\0'??? weird!!! */ 261 if (c != NULL) { /* if we don't have '\0'??? weird!!! */
228 /* move head pointer */ 262 /* move head pointer */
229 buf->head = c - buf->data + 1; 263 shbuf->head = c - shbuf->data + 1;
230 264
231 /* now write the first part of the message */ 265 /* now write the first part of the message */
232 strncpy(buf->data + buf->tail, msg, l - k - 1); 266 strncpy(shbuf->data + shbuf->tail, msg, l - k - 1);
233 267
234 /* ALWAYS terminate end of buffer w/ '\0' */ 268 /* ALWAYS terminate end of buffer w/ '\0' */
235 buf->data[buf->size - 1] = '\0'; 269 shbuf->data[shbuf->size - 1] = '\0';
236 270
237 /* now write out the rest of the string to the beginning of the buffer */ 271 /* now write out the rest of the string to the beginning of the buffer */
238 strcpy(buf->data, &msg[l - k - 1]); 272 strcpy(shbuf->data, &msg[l - k - 1]);
239 273
240 /* we need to place the TAIL at the end of the message */ 274 /* we need to place the TAIL at the end of the message */
241 buf->tail = k + 1; 275 shbuf->tail = k + 1;
242 } else { 276 } else {
243 printf(fail_msg, " from the beginning"); 277 printf(fail_msg, " from the beginning");
244 buf->head = buf->tail = 0; /* reset buffer, since it's probably corrupted */ 278 shbuf->head = shbuf->tail = 0; /* reset buffer, since it's probably corrupted */
245 } 279 }
246 280
247 } 281 }
@@ -270,7 +304,7 @@ static void message(char *fmt, ...)
270 fl.l_len = 1; 304 fl.l_len = 1;
271 305
272#ifdef CONFIG_FEATURE_IPC_SYSLOG 306#ifdef CONFIG_FEATURE_IPC_SYSLOG
273 if ((opts & SYSLOG_OPT_circularlog) && (buf != NULL)) { 307 if ((option_mask & OPT_circularlog) && shbuf) {
274 char b[1024]; 308 char b[1024];
275 309
276 va_start(arguments, fmt); 310 va_start(arguments, fmt);
@@ -290,29 +324,29 @@ static void message(char *fmt, ...)
290 if (ENABLE_FEATURE_ROTATE_LOGFILE && logFileSize > 0 ) { 324 if (ENABLE_FEATURE_ROTATE_LOGFILE && logFileSize > 0 ) {
291 struct stat statf; 325 struct stat statf;
292 int r = fstat(fd, &statf); 326 int r = fstat(fd, &statf);
293 if( !r && (statf.st_mode & S_IFREG) 327 if (!r && (statf.st_mode & S_IFREG)
294 && (lseek(fd,0,SEEK_END) > logFileSize) ) { 328 && (lseek(fd,0,SEEK_END) > logFileSize)) {
295 if(logFileRotate > 0) { 329 if (logFileRotate > 0) {
296 int i; 330 int i = strlen(logFilePath) + 4;
297 char oldFile[(strlen(logFilePath)+4)]; 331 char oldFile[i];
298 char newFile[(strlen(logFilePath)+4)]; 332 char newFile[i];
299 for(i=logFileRotate-1;i>0;i--) { 333 for (i=logFileRotate-1; i>0; i--) {
300 sprintf(oldFile, "%s.%d", logFilePath, i-1); 334 sprintf(oldFile, "%s.%d", logFilePath, i-1);
301 sprintf(newFile, "%s.%d", logFilePath, i); 335 sprintf(newFile, "%s.%d", logFilePath, i);
302 rename(oldFile, newFile); 336 rename(oldFile, newFile);
303 } 337 }
304 sprintf(newFile, "%s.%d", logFilePath, 0); 338 sprintf(newFile, "%s.%d", logFilePath, 0);
305 fl.l_type = F_UNLCK; 339 fl.l_type = F_UNLCK;
306 fcntl (fd, F_SETLKW, &fl); 340 fcntl(fd, F_SETLKW, &fl);
307 close(fd); 341 close(fd);
308 rename(logFilePath, newFile); 342 rename(logFilePath, newFile);
309 fd = device_open (logFilePath, 343 fd = device_open(logFilePath,
310 O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | 344 O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND |
311 O_NONBLOCK); 345 O_NONBLOCK);
312 fl.l_type = F_WRLCK; 346 fl.l_type = F_WRLCK;
313 fcntl (fd, F_SETLKW, &fl); 347 fcntl(fd, F_SETLKW, &fl);
314 } else { 348 } else {
315 ftruncate( fd, 0 ); 349 ftruncate(fd, 0);
316 } 350 }
317 } 351 }
318 } 352 }
@@ -362,10 +396,12 @@ static void logMessage(int pri, char *msg)
362 CODE *c_pri, *c_fac; 396 CODE *c_pri, *c_fac;
363 397
364 if (pri != 0) { 398 if (pri != 0) {
365 for (c_fac = facilitynames; 399 c_fac = facilitynames;
366 c_fac->c_name && !(c_fac->c_val == LOG_FAC(pri) << 3); c_fac++); 400 while (c_fac->c_name && !(c_fac->c_val == LOG_FAC(pri) << 3))
367 for (c_pri = prioritynames; 401 c_fac++;
368 c_pri->c_name && !(c_pri->c_val == LOG_PRI(pri)); c_pri++); 402 c_pri = prioritynames;
403 while (c_pri->c_name && !(c_pri->c_val == LOG_PRI(pri)))
404 c_pri++;
369 if (c_fac->c_name == NULL || c_pri->c_name == NULL) { 405 if (c_fac->c_name == NULL || c_pri->c_name == NULL) {
370 snprintf(res, sizeof(res), "<%d>", pri); 406 snprintf(res, sizeof(res), "<%d>", pri);
371 } else { 407 } else {
@@ -387,7 +423,7 @@ static void logMessage(int pri, char *msg)
387 /* todo: supress duplicates */ 423 /* todo: supress duplicates */
388 424
389#ifdef CONFIG_FEATURE_REMOTE_LOG 425#ifdef CONFIG_FEATURE_REMOTE_LOG
390 if (opts & SYSLOG_OPT_remotelog) { 426 if (option_mask & OPT_remotelog) {
391 char line[MAXLINE + 1]; 427 char line[MAXLINE + 1];
392 /* trying connect the socket */ 428 /* trying connect the socket */
393 if (-1 == remotefd) { 429 if (-1 == remotefd) {
@@ -401,7 +437,7 @@ static void logMessage(int pri, char *msg)
401 437
402retry: 438retry:
403 /* send message to remote logger */ 439 /* send message to remote logger */
404 if(( -1 == sendto(remotefd, line, strlen(line), 0, 440 if ((-1 == sendto(remotefd, line, strlen(line), 0,
405 (struct sockaddr *) &remoteaddr, 441 (struct sockaddr *) &remoteaddr,
406 sizeof(remoteaddr))) && (errno == EINTR)) { 442 sizeof(remoteaddr))) && (errno == EINTR)) {
407 /* sleep now seconds and retry (with now * 2) */ 443 /* sleep now seconds and retry (with now * 2) */
@@ -412,12 +448,12 @@ retry:
412 } 448 }
413 } 449 }
414 450
415 if (opts & SYSLOG_OPT_locallog) 451 if (option_mask & OPT_locallog)
416#endif 452#endif
417 { 453 {
418 /* now spew out the message to wherever it is supposed to go */ 454 /* now spew out the message to wherever it is supposed to go */
419 if (pri == 0 || LOG_PRI(pri) < logLevel) { 455 if (pri == 0 || LOG_PRI(pri) < logLevel) {
420 if (opts & SYSLOG_OPT_small) 456 if (option_mask & OPT_small)
421 message("%s %s\n", timestamp, msg); 457 message("%s %s\n", timestamp, msg);
422 else 458 else
423 message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); 459 message("%s %s %s %s\n", timestamp, LocalHostName, res, msg);
@@ -518,24 +554,23 @@ static void doSyslogd(void)
518 sock_fd = xsocket(AF_UNIX, SOCK_DGRAM, 0); 554 sock_fd = xsocket(AF_UNIX, SOCK_DGRAM, 0);
519 addrLength = sizeof(sunx.sun_family) + strlen(sunx.sun_path); 555 addrLength = sizeof(sunx.sun_family) + strlen(sunx.sun_path);
520 if (bind(sock_fd, (struct sockaddr *) &sunx, addrLength) < 0) { 556 if (bind(sock_fd, (struct sockaddr *) &sunx, addrLength) < 0) {
521 bb_perror_msg_and_die("Could not connect to socket " _PATH_LOG); 557 bb_perror_msg_and_die("cannot connect to socket %s", lfile);
522 } 558 }
523 559
524 if (chmod(lfile, 0666) < 0) { 560 if (chmod(lfile, 0666) < 0) {
525 bb_perror_msg_and_die("Could not set permission on " _PATH_LOG); 561 bb_perror_msg_and_die("cannot set permission on %s", lfile);
526 } 562 }
527 if (ENABLE_FEATURE_IPC_SYSLOG && opts & SYSLOG_OPT_circularlog) { 563 if (ENABLE_FEATURE_IPC_SYSLOG && (option_mask & OPT_circularlog)) {
528 ipcsyslog_init(); 564 ipcsyslog_init();
529 } 565 }
530 566
531 if (ENABLE_FEATURE_REMOTE_LOG && opts & SYSLOG_OPT_remotelog) { 567 if (ENABLE_FEATURE_REMOTE_LOG && (option_mask & OPT_remotelog)) {
532 init_RemoteLog(); 568 init_RemoteLog();
533 } 569 }
534 570
535 logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " "BusyBox v" BB_VER ); 571 logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " "BusyBox v" BB_VER );
536 572
537 for (;;) { 573 for (;;) {
538
539 FD_ZERO(&fds); 574 FD_ZERO(&fds);
540 FD_SET(sock_fd, &fds); 575 FD_SET(sock_fd, &fds);
541 576
@@ -544,7 +579,7 @@ static void doSyslogd(void)
544 /* alarm may have happened. */ 579 /* alarm may have happened. */
545 continue; 580 continue;
546 } 581 }
547 bb_perror_msg_and_die("select error"); 582 bb_perror_msg_and_die("select");
548 } 583 }
549 584
550 if (FD_ISSET(sock_fd, &fds)) { 585 if (FD_ISSET(sock_fd, &fds)) {
@@ -566,88 +601,66 @@ static void doSyslogd(void)
566 } /* for main loop */ 601 } /* for main loop */
567} 602}
568 603
604
569int syslogd_main(int argc, char **argv) 605int syslogd_main(int argc, char **argv)
570{ 606{
571 int opt; 607 char OPTION_DECL;
572
573 int doFork = TRUE;
574
575 char *p; 608 char *p;
576 609
577 /* do normal option parsing */ 610 /* do normal option parsing */
578 while ((opt = getopt(argc, argv, "m:nO:s:Sb:R:LC::")) > 0) { 611 option_mask = bb_getopt_ulflags(argc, argv, OPTION_STR, OPTION_PARAM);
579 switch (opt) { 612 if (option_mask & OPT_mark) MarkInterval = atoi(opt_m) * 60; // -m
580 case 'm': 613 //if (option_mask & OPT_nofork) // -n
581 MarkInterval = atoi(optarg) * 60; 614 //if (option_mask & OPT_outfile) // -O
582 break; 615 if (option_mask & OPT_loglevel) { // -l
583 case 'n': 616 logLevel = atoi(opt_l);
584 doFork = FALSE; 617 /* Valid levels are between 1 and 8 */
585 break; 618 if (logLevel < 1 || logLevel > 8)
586 case 'O': 619 bb_show_usage();
587 logFilePath = optarg; 620 }
588 break; 621 //if (option_mask & OPT_small) // -S
589 case 'l': 622#if ENABLE_FEATURE_ROTATE_LOGFILE
590 logLevel = atoi(optarg); 623 if (option_mask & OPT_filesize) logFileSize = atoi(opt_s) * 1024; // -s
591 /* Valid levels are between 1 and 8 */ 624 if (option_mask & OPT_rotatecnt) { // -b
592 if (logLevel < 1 || logLevel > 8) { 625 logFileRotate = atoi(opt_b);
593 bb_show_usage(); 626 if (logFileRotate > 99) logFileRotate = 99;
594 } 627 }
595 break;
596#ifdef CONFIG_FEATURE_ROTATE_LOGFILE
597 case 's':
598 logFileSize = atoi(optarg) * 1024;
599 break;
600 case 'b':
601 logFileRotate = atoi(optarg);
602 if( logFileRotate > 99 ) logFileRotate = 99;
603 break;
604#endif
605#ifdef CONFIG_FEATURE_REMOTE_LOG
606 case 'R':
607 RemoteHost = xstrdup(optarg);
608 if ((p = strchr(RemoteHost, ':'))) {
609 RemotePort = atoi(p + 1);
610 *p = '\0';
611 }
612 opts |= SYSLOG_OPT_remotelog;
613 break;
614 case 'L':
615 opts |= SYSLOG_OPT_locallog;
616 break;
617#endif 628#endif
618#ifdef CONFIG_FEATURE_IPC_SYSLOG 629#if ENABLE_FEATURE_REMOTE_LOG
619 case 'C': 630 if (option_mask & OPT_remotelog) { // -R
620 if (optarg) { 631 RemoteHost = xstrdup(opt_R);
621 int buf_size = atoi(optarg); 632 p = strchr(RemoteHost, ':');
622 if (buf_size >= 4) { 633 if (p) {
623 shm_size = buf_size * 1024; 634 RemotePort = atoi(p + 1);
624 } 635 *p = '\0';
625 } 636 }
626 opts |= SYSLOG_OPT_circularlog; 637 }
627 break; 638 //if (option_mask & OPT_locallog) // -L
628#endif 639#endif
629 case 'S': 640#if ENABLE_FEATURE_IPC_SYSLOG
630 opts |= SYSLOG_OPT_small; 641 if (option_mask & OPT_circularlog) { // -C
631 break; 642 if (opt_C) {
632 default: 643 int buf_size = atoi(opt_C);
633 bb_show_usage(); 644 if (buf_size >= 4)
645 shm_size = buf_size * 1024;
634 } 646 }
635 } 647 }
648#endif
636 649
637 /* If they have not specified remote logging, then log locally */ 650 /* If they have not specified remote logging, then log locally */
638 if (ENABLE_FEATURE_REMOTE_LOG && !(opts & SYSLOG_OPT_remotelog)) 651 if (ENABLE_FEATURE_REMOTE_LOG && !(option_mask & OPT_remotelog))
639 opts |= SYSLOG_OPT_locallog; 652 option_mask |= OPT_locallog;
640
641 653
642 /* Store away localhost's name before the fork */ 654 /* Store away localhost's name before the fork */
643 gethostname(LocalHostName, sizeof(LocalHostName)); 655 gethostname(LocalHostName, sizeof(LocalHostName));
644 if ((p = strchr(LocalHostName, '.'))) { 656 p = strchr(LocalHostName, '.');
657 if (p) {
645 *p = '\0'; 658 *p = '\0';
646 } 659 }
647 660
648 umask(0); 661 umask(0);
649 662
650 if (doFork == TRUE) { 663 if (!(option_mask & OPT_nofork)) {
651#ifdef BB_NOMMU 664#ifdef BB_NOMMU
652 vfork_daemon_rexec(0, 1, argc, argv, "-n"); 665 vfork_daemon_rexec(0, 1, argc, argv, "-n");
653#else 666#else