1 #include "headers.h"
2
3 static QLock logreflock, logprintlock;
4 static int locked;
5
6 void
smbloglock(void)7 smbloglock(void)
8 {
9 qlock(&logreflock);
10 if (locked++ == 0)
11 qlock(&logprintlock);
12 qunlock(&logreflock);
13 }
14
15 void
smblogunlock(void)16 smblogunlock(void)
17 {
18 qlock(&logreflock);
19 if (locked && --locked == 0)
20 qunlock(&logprintlock);
21 qunlock(&logreflock);
22 }
23
24 static int
smbloglockedvprint(char * fmt,va_list ap)25 smbloglockedvprint(char *fmt, va_list ap)
26 {
27 if (smbglobals.log.fd >= 0)
28 vfprint(smbglobals.log.fd, fmt, ap);
29 if (smbglobals.log.print)
30 vfprint(2, fmt, ap);
31 return 0;
32 }
33
34 int
smblogvprint(int cmd,char * fmt,va_list ap)35 smblogvprint(int cmd, char *fmt, va_list ap)
36 {
37 if (cmd < 0 || smboptable[cmd].debug) {
38 smbloglock();
39 smbloglockedvprint(fmt, ap);
40 smblogunlock();
41 }
42 return 0;
43 }
44
45 int
smblogprint(int cmd,char * fmt,...)46 smblogprint(int cmd, char *fmt, ...)
47 {
48 if (cmd < 0 || smbtrans2optable[cmd].debug) {
49 va_list ap;
50 va_start(ap, fmt);
51 smblogvprint(cmd, fmt, ap);
52 va_end(ap);
53 }
54 return 0;
55 }
56
57 int
translogprint(int cmd,char * fmt,...)58 translogprint(int cmd, char *fmt, ...)
59 {
60 if (cmd < 0 || smboptable[cmd].debug) {
61 va_list ap;
62 va_start(ap, fmt);
63 smblogvprint(cmd, fmt, ap);
64 va_end(ap);
65 }
66 return 0;
67 }
68
69 int
smblogprintif(int v,char * fmt,...)70 smblogprintif(int v, char *fmt, ...)
71 {
72 if (v) {
73 va_list ap;
74 va_start(ap, fmt);
75 smbloglock();
76 smbloglockedvprint(fmt, ap);
77 smblogunlock();
78 va_end(ap);
79 }
80 return 0;
81 }
82
83 void
smblogdata(int cmd,int (* print)(int cmd,char * fmt,...),void * ap,long n,long limit)84 smblogdata(int cmd, int (*print)(int cmd, char *fmt, ...), void *ap, long n, long limit)
85 {
86 uchar *p = ap;
87 long i;
88 long saven;
89 i = 0;
90 saven = n;
91 if (saven > limit)
92 n = limit;
93 while (i < n) {
94 int l = n - i < 16 ? n - i : 16;
95 int b;
96 (*print)(cmd, "0x%.4lux ", i);
97 for (b = 0; b < l; b += 2) {
98 (*print)(cmd, " %.2ux", p[i + b]);
99 if (b < l - 1)
100 (*print)(cmd, "%.2ux", p[i + b + 1]);
101 else
102 (*print)(cmd, " ");
103 }
104 while (b < 16) {
105 (*print)(cmd, " ");
106 b += 2;
107 }
108 (*print)(cmd, " ");
109 for (b = 0; b < l; b++)
110 if (p[i + b] >= ' ' && p[i + b] <= '~')
111 (*print)(cmd, "%c", p[i + b]);
112 else
113 (*print)(cmd, ".");
114 (*print)(cmd, "\n");
115 i += l;
116 }
117 if (saven > limit)
118 (*print)(cmd, "0x%.4ux ...\n0x%.4ux\n", limit, saven);
119 }
120