]> andersk Git - moira.git/blob - server/mr_util.c
Use unsigned char rather than char to prevent sign extension
[moira.git] / server / mr_util.c
1 /*
2  *      $Source$
3  *      $Author$
4  *      $Header$
5  *
6  *      Copyright (C) 1987 by the Massachusetts Institute of Technology
7  *
8  *      $Log$
9  *      Revision 1.8  1987-07-29 16:02:48  wesommer
10  *      Use unsigned char rather than char to prevent sign extension
11  *      problem.
12  *
13  * Revision 1.7  87/07/14  00:39:47  wesommer
14  * Changed interface to log_args.
15  * 
16  * Revision 1.6  87/07/06  16:09:07  wesommer
17  * Only print ... if the string is too long..
18  * 
19  * Revision 1.5  87/06/30  20:05:52  wesommer
20  * Added range checking.
21  * 
22  * Revision 1.4  87/06/21  16:42:19  wesommer
23  * Performance work, rearrangement of include files.
24  * 
25  * Revision 1.3  87/06/04  01:35:28  wesommer
26  * Added better logging routines.
27  * 
28  * Revision 1.2  87/06/03  16:08:07  wesommer
29  * Fixes for lint.
30  * 
31  * Revision 1.1  87/06/02  20:07:32  wesommer
32  * Initial revision
33  * 
34  */
35
36 #ifndef lint
37 static char *rcsid_sms_util_c = "$Header$";
38 #endif lint
39
40 #include "sms_server.h"
41
42 #include <ctype.h>
43 #include <strings.h>
44
45 extern char *whoami;
46
47 char *
48 requote(buf, cp, len)
49         char *buf;
50         register char *cp;
51 {
52         register int count = 0;
53         register unsigned char c;
54         if (len <= 2) return buf;
55         *buf++ = '"'; count++; len--;
56         for(; (count < 40) && (len > 1) && (c = *cp);
57             cp++, --len, ++count) {
58                 if (c == '\\' || c == '"') *buf++ = '\\';
59                 if (isprint(c)) *buf++ = c;
60                 else {
61                         sprintf(buf, "\\%03o", c);
62                         buf = index(buf, '\0');
63                 }
64         }
65         if (len > 1) { *buf++ = '"'; count++; len--; }
66         if (len > 3 && count >= 40) {
67                 *buf++ = '.'; count++; len--;
68                 *buf++ = '.'; count++; len--;
69                 *buf++ = '.'; count++; len--;
70         }
71         if (len > 1) *buf = '\0';
72         return buf;
73 }
74
75 log_args(tag, argc, argv)
76         char *tag;
77         int argc;
78         char **argv;
79 {
80         char buf[BUFSIZ];
81         register int i;
82         register char *bp = buf;
83         
84         i = strlen(tag);
85         bcopy(tag, bp, i+1);
86         bp += i;
87         *bp++ =':';
88         *bp++ =' ';
89        
90         for (i = 0; i < argc && ((buf - bp) + 1024) > 2; i++) {
91                 if (i != 0) {
92                         *bp++ = ',';
93                         *bp++ = ' '; 
94                 }
95                 bp = requote(bp, argv[i], (buf - bp) + 1024);
96         }
97         *bp = '\0';
98         com_err(whoami, 0, buf);
99 }
100         
101 void sms_com_err(whoami, code, message)
102         char *whoami;
103         int code;
104         char *message;
105 {
106         extern char *error_message();
107         extern client *cur_client;
108         
109         struct iovec strings[7];
110         char buf[32];
111         if (cur_client)
112                 (void) sprintf(buf, "[#%d]", cur_client->id);
113         else buf[0]='\0';
114         
115         strings[1].iov_base = buf;
116         strings[1].iov_len = strlen(buf);
117         
118         strings[0].iov_base = whoami;
119         if (whoami) {
120                 strings[0].iov_len = strlen(whoami);
121                 strings[2].iov_base = ": ";
122                 strings[2].iov_len = 2;
123         } else {
124                 strings[0].iov_len = 0;
125                 strings[2].iov_base = " ";
126                 strings[2].iov_len = 1;
127         }
128         if (code) {
129                 register char *errmsg = error_message(code);
130                 strings[3].iov_base = errmsg;
131                 strings[3].iov_len = strlen(errmsg);
132                 strings[4].iov_base = " ";
133                 strings[4].iov_len = 1;
134         } else {
135                 strings[3].iov_len = 0;
136                 strings[4].iov_len = 0;
137         }
138         strings[5].iov_base = message;
139         strings[5].iov_len = strlen(message);
140         strings[6].iov_base = "\n";
141         strings[6].iov_len = 1;
142         (void) writev(2, strings, 7);
143 }
This page took 0.489233 seconds and 5 git commands to generate.