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