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