Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "headers.h"

static QLock logreflock, logprintlock;
static int locked;

void
smbloglock(void)
{
        qlock(&logreflock);
        if (locked++ == 0)
                qlock(&logprintlock);
        qunlock(&logreflock);
}

void
smblogunlock(void)
{
        qlock(&logreflock);
        if (locked && --locked == 0)
                qunlock(&logprintlock);
        qunlock(&logreflock);
}

static int
smbloglockedvprint(char *fmt, va_list ap)
{
        if (smbglobals.log.fd >= 0)
                vfprint(smbglobals.log.fd, fmt, ap);
        if (smbglobals.log.print)
                vfprint(2, fmt, ap);
        return 0;
}

int
smblogvprint(int cmd, char *fmt, va_list ap)
{
        if (cmd < 0 || smboptable[cmd].debug) {
                smbloglock();
                smbloglockedvprint(fmt, ap);
                smblogunlock();
        }
        return 0;
}

int
smblogprint(int cmd, char *fmt, ...)
{
        if (cmd < 0 || smbtrans2optable[cmd].debug) {
                va_list ap;
                va_start(ap, fmt);
                smblogvprint(cmd, fmt, ap);
                va_end(ap);
        }
        return 0;
}

int
translogprint(int cmd, char *fmt, ...)
{
        if (cmd < 0 || smboptable[cmd].debug) {
                va_list ap;
                va_start(ap, fmt);
                smblogvprint(cmd, fmt, ap);
                va_end(ap);
        }
        return 0;
}

int
smblogprintif(int v, char *fmt, ...)
{
        if (v) {
                va_list ap;
                va_start(ap, fmt);
                smbloglock();
                smbloglockedvprint(fmt, ap);
                smblogunlock();
                va_end(ap);
        }
        return 0;
}

void
smblogdata(int cmd, int (*print)(int cmd, char *fmt, ...), void *ap, long n, long limit)
{
        uchar *p = ap;
        long i;
        long saven;
        i = 0;
        saven = n;
        if (saven > limit)
                n = limit;
        while (i < n) {
                int l = n - i < 16 ? n - i : 16;
                int b;
                (*print)(cmd, "0x%.4lux  ", i);
                for (b = 0; b < l; b += 2) {
                        (*print)(cmd, " %.2ux", p[i + b]);
                        if (b < l - 1)
                                (*print)(cmd, "%.2ux", p[i + b + 1]);
                        else
                                (*print)(cmd, "  ");
                }
                while (b < 16) {
                        (*print)(cmd, "     ");
                        b += 2;
                }
                (*print)(cmd, "        ");
                for (b = 0; b < l; b++)
                        if (p[i + b] >= ' ' && p[i + b] <= '~')
                                (*print)(cmd, "%c", p[i + b]);
                        else
                                (*print)(cmd, ".");
                (*print)(cmd, "\n");
                i += l;
        }
        if (saven > limit)
                (*print)(cmd, "0x%.4ux   ...\n0x%.4ux\n", limit, saven);
}