~ubuntu-branches/ubuntu/hardy/open-iscsi/hardy-updates

« back to all changes in this revision

Viewing changes to usr/log.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Zobel-Helas
  • Date: 2006-12-03 16:54:21 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20061203165421-xhttz5j4l9sowg8u
Tags: 2.0.730-0.2
upload to unstable, as no new bugs arised.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
#include <sys/shm.h>
16
16
#include <sys/ipc.h>
17
17
#include <sys/types.h>
 
18
#include <sys/types.h>
 
19
#include <sys/wait.h>
18
20
 
 
21
#include "util.h"
19
22
#include "log.h"
20
23
 
21
24
#define SEMKEY  0xA7L
31
34
int log_daemon = 1;
32
35
int log_level = 0;
33
36
 
 
37
static int log_stop_daemon = 0;
 
38
 
34
39
static int logarea_init (int size)
35
40
{
36
41
        int shmid;
307
312
#define dump_line() __dump_line(level, char_buf, &char_cnt)
308
313
#define dump_char(ch) __dump_char(level, char_buf, &char_cnt, ch)
309
314
 
310
 
void log_pdu(int level, iscsi_pdu_t *pdu)
311
 
{
312
 
        unsigned char char_buf[16];
313
 
        int char_cnt = 0;
314
 
        unsigned char *buf;
315
 
        int i;
316
 
        return;
317
 
 
318
 
        if (log_level <= level)
319
 
                return;
320
 
 
321
 
        buf = (void *)&pdu->bhs;
322
 
        log_debug(level, "BHS: (%p)", buf);
323
 
        for (i = 0; i < BHS_SIZE; i++)
324
 
                dump_char(*buf++);
325
 
        dump_line();
326
 
 
327
 
        buf = (void *)pdu->ahs;
328
 
        log_debug(level, "AHS: (%p)", buf);
329
 
        for (i = 0; i < pdu->ahssize; i++)
330
 
                dump_char(*buf++);
331
 
        dump_line();
332
 
 
333
 
        buf = (void *)pdu->data;
334
 
        log_debug(level, "Data: (%p)", buf);
335
 
        for (i = 0; i < pdu->datasize; i++)
336
 
                dump_char(*buf++);
337
 
        dump_line();
338
 
}
339
 
 
340
315
static void log_flush(void)
341
316
{
342
317
        while (!la->empty) {
355
330
        }
356
331
}
357
332
 
 
333
static void catch_signal(int signo)
 
334
{
 
335
        switch (signo) {
 
336
        case SIGSEGV:
 
337
                log_flush();
 
338
                break;
 
339
        case SIGTERM:
 
340
                log_stop_daemon = 1;
 
341
                break;
 
342
        }
 
343
 
 
344
        log_warning("pid %d caught signal -%d", getpid(), signo);
 
345
}
 
346
 
 
347
static void __log_close(void)
 
348
{
 
349
        log_flush();
 
350
        closelog();
 
351
        free_logarea();
 
352
}
 
353
 
358
354
int log_init(char *program_name, int size)
359
355
{
360
356
        logdbg(stderr,"enter log_init\n");
361
357
        log_name = program_name;
 
358
 
362
359
        if (log_daemon) {
363
360
                struct sigaction sa_old;
364
361
                struct sigaction sa_new;
368
365
                setlogmask (LOG_UPTO (LOG_DEBUG));
369
366
 
370
367
                if (logarea_init(size))
371
 
                        return 1;
 
368
                        return -1;
372
369
 
373
370
                pid = fork();
374
371
                if (pid < 0) {
377
374
                } else if (pid) {
378
375
                        syslog(LOG_WARNING,
379
376
                               "iSCSI logger with pid=%d started!", pid);
380
 
                        return 0;
 
377
                        return pid;
381
378
                }
382
379
 
 
380
                daemon_init();
 
381
 
383
382
                /* flush on daemon's crash */
384
 
                sa_new.sa_handler = (void*)log_flush;
 
383
                sa_new.sa_handler = (void*)catch_signal;
385
384
                sigemptyset(&sa_new.sa_mask);
386
385
                sa_new.sa_flags = 0;
387
386
                sigaction(SIGSEGV, &sa_new, &sa_old );
 
387
                sigaction(SIGTERM, &sa_new, &sa_old );
388
388
 
389
389
                while(1) {
390
390
                        log_flush();
391
391
                        sleep(1);
 
392
 
 
393
                        if (log_stop_daemon)
 
394
                                break;
392
395
                }
 
396
 
 
397
                __log_close();
393
398
                exit(0);
394
399
        }
395
400
 
396
401
        return 0;
397
402
}
398
403
 
399
 
void log_close (void)
 
404
void log_close(pid_t pid)
400
405
{
401
 
        if (log_daemon) {
402
 
                closelog();
403
 
                free_logarea();
 
406
        int status;
 
407
 
 
408
        if (!log_daemon || pid <= 0) {
 
409
                __log_close();
 
410
                return;
404
411
        }
405
 
        return;
 
412
 
 
413
        kill(pid, SIGTERM);
 
414
        waitpid(pid, &status, 0);
406
415
}