xref: /plan9/sys/src/cmd/aquarela/smblog.c (revision 86a363cef6b6fa09d9392d8587eef2e5ef8d657e)
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