]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/loader/server/src/log.cc
Update
[l4.git] / l4 / pkg / loader / server / src / log.cc
1 /*
2  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3  *               Alexander Warg <warg@os.inf.tu-dresden.de>,
4  *               Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
5  *     economic rights: Technische Universität Dresden (Germany)
6  *
7  * This file is part of TUD:OS and distributed under the terms of the
8  * GNU General Public License 2.
9  * Please see the COPYING-GPL-2 file for details.
10  */
11 #include <l4/re/log>
12 #include <l4/re/log-sys.h>
13 #include <l4/sys/kdebug.h>
14 #include <l4/cxx/minmax>
15
16 #include "log.h"
17 #include "global.h"
18 #include "obj_reg.h"
19
20 #include <cstdio>
21 #include <unistd.h>
22
23 static Ldr::Log *last_log = 0;
24
25 static void my_outnstring(char const *s, unsigned long len)
26 {
27   write(1, s, len);
28 }
29
30 static void mycpy(char **buf, int *rem, char const *s, int l)
31 {
32   int o = cxx::min(*rem, l);
33   memcpy(*buf, s, o);
34   *rem -= o;
35   *buf += o;
36 }
37
38 static char msgbuf[4096];
39
40 l4_msgtag_t
41 Ldr::Log::op_dispatch(l4_utcb_t *utcb, l4_msgtag_t tag, L4::Vcon::Rights)
42 {
43   if (tag.words() < 2)
44     return l4_msgtag(-L4_EINVAL, 0, 0, 0);
45
46   l4_msg_regs_t *m = l4_utcb_mr_u(utcb);
47   L4::Opcode op = m->mr[0];
48
49   // we only have one opcode
50   if (op != L4Re::Log_::Print)
51     return l4_msgtag(-L4_ENOSYS, 0, 0, 0);
52
53   char *msg = Glbl::log_buffer;
54   unsigned long len_msg = sizeof(Glbl::log_buffer);
55
56   if (len_msg > (tag.words() - 2) * sizeof(l4_umword_t))
57     len_msg = (tag.words() - 2) * sizeof(l4_umword_t);
58
59   if (len_msg > m->mr[1])
60     len_msg = m->mr[1];
61
62   memcpy(msg, &m->mr[2], len_msg);
63
64   int rem = sizeof(msgbuf);
65   while (len_msg > 0 && msg[0])
66     {
67       char *obuf = msgbuf;
68 #if 1
69       if (color())
70         {
71           int n = snprintf(obuf, rem, "\033[%s3%dm",
72               (color() & 8) ? "01;" : "", (color() & 7));
73           obuf = obuf + n;
74           rem -= n;
75         }
76       else
77         mycpy(&obuf, &rem, "\033[0m", 4);
78 #endif
79       if (last_log != this)
80         {
81           if (last_log != 0)
82             my_outnstring("\n", 1);
83
84           mycpy(&obuf, &rem, _tag, cxx::min<unsigned long>(_l, Max_tag));
85           if (_l < Max_tag)
86             mycpy(&obuf, &rem, "             ", Max_tag-_l);
87
88           if (_in_line)
89             mycpy(&obuf, &rem, ": ", 2);
90           else
91             mycpy(&obuf, &rem, "| ", 2);
92         }
93
94       unsigned long i;
95       for (i = 0; i < len_msg; ++i)
96         if (msg[i] == '\n' || msg[i] == 0)
97           break;
98
99       mycpy(&obuf, &rem, msg, i);
100
101       if (i <len_msg && msg[i] == '\n')
102         {
103           if (color())
104             mycpy(&obuf, &rem, "\033[0m", 4);
105           mycpy(&obuf, &rem, "\n", 1);
106           _in_line = false;
107           last_log = 0;
108           ++i;
109         }
110       else
111         {
112           last_log = this;
113           _in_line = true;
114         }
115       my_outnstring(msgbuf, obuf-msgbuf);
116
117       msg += i;
118       len_msg -= i;
119     }
120
121   if (_in_line && color())
122     my_outnstring("\033[0m", 4);
123
124   // and finally done
125   return l4_msgtag(-L4_ENOREPLY, 0, 0, 0);
126 }
127
128
129 int
130 Ldr::Log::color_value(cxx::String const &col)
131 {
132   int c = 0, bright = 0;
133
134   if (col.empty())
135     return 0;
136
137   switch(col[0])
138     {
139     case 'N': bright = 1; case 'n': c = 0; break;
140     case 'R': bright = 1; case 'r': c = 1; break;
141     case 'G': bright = 1; case 'g': c = 2; break;
142     case 'Y': bright = 1; case 'y': c = 3; break;
143     case 'B': bright = 1; case 'b': c = 4; break;
144     case 'M': bright = 1; case 'm': c = 5; break;
145     case 'C': bright = 1; case 'c': c = 6; break;
146     case 'W': bright = 1; case 'w': c = 7; break;
147     default: c = 0;
148     }
149
150   return (bright << 3) | c;
151 }
152