/etc/mail: Install 4 sample mailer.conf files
[dragonfly.git] / lib / libdmsg / debug.c
1 /*
2  * Copyright (c) 2012 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@dragonflybsd.org>
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34
35 #include "dmsg_local.h"
36
37 const char *
38 dmsg_basecmd_str(uint32_t cmd)
39 {
40         static char buf[64];
41         char protobuf[32];
42         char cmdbuf[32];
43         const char *protostr;
44         const char *cmdstr;
45
46         switch(cmd & DMSGF_PROTOS) {
47         case DMSG_PROTO_LNK:
48                 protostr = "LNK_";
49                 break;
50         case DMSG_PROTO_DBG:
51                 protostr = "DBG_";
52                 break;
53         case DMSG_PROTO_HM2:
54                 protostr = "HM2_";
55                 break;
56         case DMSG_PROTO_BLK:
57                 protostr = "BLK_";
58                 break;
59         case DMSG_PROTO_VOP:
60                 protostr = "VOP_";
61                 break;
62         default:
63                 snprintf(protobuf, sizeof(protobuf), "%x_",
64                         (cmd & DMSGF_PROTOS) >> 20);
65                 protostr = protobuf;
66                 break;
67         }
68
69         switch(cmd & (DMSGF_PROTOS |
70                       DMSGF_CMDS |
71                       DMSGF_SIZE)) {
72         case DMSG_LNK_PAD:
73                 cmdstr = "PAD";
74                 break;
75         case DMSG_LNK_PING:
76                 cmdstr = "PING";
77                 break;
78         case DMSG_LNK_AUTH:
79                 cmdstr = "AUTH";
80                 break;
81         case DMSG_LNK_CONN:
82                 cmdstr = "CONN";
83                 break;
84         case DMSG_LNK_SPAN:
85                 cmdstr = "SPAN";
86                 break;
87         case DMSG_LNK_ERROR:
88                 if (cmd & DMSGF_DELETE)
89                         cmdstr = "RETURN";
90                 else
91                         cmdstr = "RESULT";
92                 break;
93         case DMSG_DBG_SHELL:
94                 cmdstr = "SHELL";
95                 break;
96         default:
97                 snprintf(cmdbuf, sizeof(cmdbuf),
98                          "%06x", (cmd & (DMSGF_PROTOS |
99                                          DMSGF_CMDS |
100                                          DMSGF_SIZE)));
101                 cmdstr = cmdbuf;
102                 break;
103         }
104         snprintf(buf, sizeof(buf), "%s%s", protostr, cmdstr);
105         return (buf);
106 }
107
108 const char *
109 dmsg_msg_str(dmsg_msg_t *msg)
110 {
111         dmsg_state_t *state;
112         static char buf[256];
113         char errbuf[16];
114         char statebuf[64];
115         char flagbuf[64];
116         const char *statestr;
117         const char *errstr;
118         uint32_t basecmd;
119         int i;
120
121         /*
122          * Parse the state
123          */
124         if ((state = msg->state) != NULL) {
125                 basecmd = (state->rxcmd & DMSGF_REPLY) ?
126                           state->txcmd : state->rxcmd;
127                 snprintf(statebuf, sizeof(statebuf),
128                          " %s=%s,L=%s%s,R=%s%s",
129                          ((state->txcmd & DMSGF_REPLY) ?
130                                 "rcvcmd" : "sndcmd"),
131                          dmsg_basecmd_str(basecmd),
132                          ((state->txcmd & DMSGF_CREATE) ? "C" : ""),
133                          ((state->txcmd & DMSGF_DELETE) ? "D" : ""),
134                          ((state->rxcmd & DMSGF_CREATE) ? "C" : ""),
135                          ((state->rxcmd & DMSGF_DELETE) ? "D" : "")
136                 );
137                 statestr = statebuf;
138         } else {
139                 statestr = "";
140         }
141
142         /*
143          * Parse the error
144          */
145         switch(msg->any.head.error) {
146         case 0:
147                 errstr = "";
148                 break;
149         case DMSG_IOQ_ERROR_SYNC:
150                 errstr = "err=IOQ:NOSYNC";
151                 break;
152         case DMSG_IOQ_ERROR_EOF:
153                 errstr = "err=IOQ:STREAMEOF";
154                 break;
155         case DMSG_IOQ_ERROR_SOCK:
156                 errstr = "err=IOQ:SOCKERR";
157                 break;
158         case DMSG_IOQ_ERROR_FIELD:
159                 errstr = "err=IOQ:BADFIELD";
160                 break;
161         case DMSG_IOQ_ERROR_HCRC:
162                 errstr = "err=IOQ:BADHCRC";
163                 break;
164         case DMSG_IOQ_ERROR_XCRC:
165                 errstr = "err=IOQ:BADXCRC";
166                 break;
167         case DMSG_IOQ_ERROR_ACRC:
168                 errstr = "err=IOQ:BADACRC";
169                 break;
170         case DMSG_IOQ_ERROR_STATE:
171                 errstr = "err=IOQ:BADSTATE";
172                 break;
173         case DMSG_IOQ_ERROR_NOPEER:
174                 errstr = "err=IOQ:PEERCONFIG";
175                 break;
176         case DMSG_IOQ_ERROR_NORKEY:
177                 errstr = "err=IOQ:BADRKEY";
178                 break;
179         case DMSG_IOQ_ERROR_NOLKEY:
180                 errstr = "err=IOQ:BADLKEY";
181                 break;
182         case DMSG_IOQ_ERROR_KEYXCHGFAIL:
183                 errstr = "err=IOQ:BADKEYXCHG";
184                 break;
185         case DMSG_IOQ_ERROR_KEYFMT:
186                 errstr = "err=IOQ:BADFMT";
187                 break;
188         case DMSG_IOQ_ERROR_BADURANDOM:
189                 errstr = "err=IOQ:BADRANDOM";
190                 break;
191         case DMSG_IOQ_ERROR_MSGSEQ:
192                 errstr = "err=IOQ:BADSEQ";
193                 break;
194         case DMSG_IOQ_ERROR_EALREADY:
195                 errstr = "err=IOQ:DUPMSG";
196                 break;
197         case DMSG_IOQ_ERROR_TRANS:
198                 errstr = "err=IOQ:BADTRANS";
199                 break;
200         case DMSG_IOQ_ERROR_IVWRAP:
201                 errstr = "err=IOQ:IVWRAP";
202                 break;
203         case DMSG_IOQ_ERROR_MACFAIL:
204                 errstr = "err=IOQ:MACFAIL";
205                 break;
206         case DMSG_IOQ_ERROR_ALGO:
207                 errstr = "err=IOQ:ALGOFAIL";
208                 break;
209         case DMSG_ERR_NOSUPP:
210                 errstr = "err=NOSUPPORT";
211                 break;
212         default:
213                 snprintf(errbuf, sizeof(errbuf),
214                          " err=%d", msg->any.head.error);
215                 errstr = errbuf;
216                 break;
217         }
218
219         /*
220          * Message flags
221          */
222         i = 0;
223         if (msg->any.head.cmd & (DMSGF_CREATE | DMSGF_DELETE |
224                                  DMSGF_ABORT | DMSGF_REPLY)) {
225                 flagbuf[i++] = '|';
226                 if (msg->any.head.cmd & DMSGF_CREATE)
227                         flagbuf[i++] = 'C';
228                 if (msg->any.head.cmd & DMSGF_DELETE)
229                         flagbuf[i++] = 'D';
230                 if (msg->any.head.cmd & DMSGF_REPLY)
231                         flagbuf[i++] = 'R';
232                 if (msg->any.head.cmd & DMSGF_ABORT)
233                         flagbuf[i++] = 'A';
234         }
235         flagbuf[i] = 0;
236
237         /*
238          * Generate the buf
239          */
240         snprintf(buf, sizeof(buf),
241                 "msg=%s%s %s msgid=%08x %s",
242                  dmsg_basecmd_str(msg->any.head.cmd),
243                  flagbuf,
244                  errstr,
245                  (uint32_t)(intmax_t)msg->any.head.msgid,   /* for brevity */
246                  statestr);
247
248         return(buf);
249 }