Whamcloud - gitweb
LU-8058 utils: Remove old commented out code
[fs/lustre-release.git] / lustre / utils / gss / cacheio.c
1 /*
2   Copyright (c) 2004 The Regents of the University of Michigan.
3   All rights reserved.
4
5   Redistribution and use in source and binary forms, with or without
6   modification, are permitted provided that the following conditions
7   are met:
8
9   1. Redistributions of source code must retain the above copyright
10      notice, this list of conditions and the following disclaimer.
11   2. Redistributions in binary form must reproduce the above copyright
12      notice, this list of conditions and the following disclaimer in the
13      documentation and/or other materials provided with the distribution.
14   3. Neither the name of the University nor the names of its
15      contributors may be used to endorse or promote products derived
16      from this software without specific prior written permission.
17
18   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
19   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21   DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25   BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 /*
32  * support/nfs/cacheio.c
33  * support IO on the cache channel files in 2.5 and beyond.
34  * These use 'qwords' which are like words, but with a little quoting.
35  *
36  */
37
38
39 /*
40  * Support routines for text-based upcalls.
41  * Fields are separated by spaces.
42  * Fields are either mangled to quote space tab newline slosh with slosh
43  * or a hexified with a leading \x
44  * Record is terminated with newline.
45  *
46  */
47
48 #include "cacheio.h"
49 #include <stdio.h>
50 #include <ctype.h>
51 #include <unistd.h>
52 #include <sys/types.h>
53 #include <sys/stat.h>
54 #include <fcntl.h>
55 #include <time.h>
56 #include <stdlib.h>
57 #include <string.h>
58 #include <errno.h>
59 #include "err_util.h"
60
61 void qword_add(char **bpp, int *lp, const char *str)
62 {
63         char *bp = *bpp;
64         int len = *lp;
65         char c;
66
67         if (len < 0) return;
68
69         while ((c=*str++) && len)
70                 switch(c) {
71                 case ' ':
72                 case '\t':
73                 case '\n':
74                 case '\\':
75                         if (len >= 4) {
76                                 *bp++ = '\\';
77                                 *bp++ = '0' + ((c & 0300)>>6);
78                                 *bp++ = '0' + ((c & 0070)>>3);
79                                 *bp++ = '0' + ((c & 0007)>>0);
80                         }
81                         len -= 4;
82                         break;
83                 default:
84                         *bp++ = c;
85                         len--;
86                 }
87         if (c || len <1) len = -1;
88         else {
89                 *bp++ = ' ';
90                 len--;
91         }
92         *bpp = bp;
93         *lp = len;
94 }
95
96 void qword_addhex(char **bpp, int *lp, char *buf, int blen)
97 {
98         char *bp = *bpp;
99         int len = *lp;
100
101         if (len < 0) return;
102
103         if (len > 2) {
104                 *bp++ = '\\';
105                 *bp++ = 'x';
106                 len -= 2;
107                 while (blen && len >= 2) {
108                         unsigned char c = *buf++;
109                         *bp++ = '0' + ((c&0xf0)>>4) + (c>=0xa0)*('a'-'9'-1);
110                         *bp++ = '0' + (c&0x0f) + ((c&0x0f)>=0x0a)*('a'-'9'-1);
111                         len -= 2;
112                         blen--;
113                 }
114         }
115         if (blen || len<1) len = -1;
116         else {
117                 *bp++ = ' ';
118                 len--;
119         }
120         *bpp = bp;
121         *lp = len;
122 }
123
124 void qword_addint(char **bpp, int *lp, int n)
125 {
126         int len;
127
128         len = snprintf(*bpp, *lp, "%d ", n);
129         if (len > *lp)
130                 len = *lp;
131         *bpp += len;
132         *lp -= len;
133 }
134
135 void qword_adduint(char **bpp, int *lp, unsigned int n)
136 {
137         int len;
138
139         len = snprintf(*bpp, *lp, "%u ", n);
140         if (len > *lp)
141                 len = *lp;
142         *bpp += len;
143         *lp -= len;
144 }
145
146 void qword_addeol(char **bpp, int *lp)
147 {
148         if (*lp <= 0)
149                 return;
150         **bpp = '\n';
151         (*bpp)++;
152         (*lp)--;
153 }
154
155 static char qword_buf[8192];
156 static char tmp_buf[8192];
157 int qword_print(FILE *f, const char *str)
158 {
159         char *bp = qword_buf;
160         int len = sizeof(qword_buf);
161         size_t sret;
162
163         qword_add(&bp, &len, str);
164         sret = fwrite(qword_buf, bp-qword_buf, 1, f);
165         /* XXX: */
166         memcpy(tmp_buf, qword_buf, bp-qword_buf);
167         tmp_buf[bp-qword_buf] = '\0';
168         printerr(2, "%s", tmp_buf);
169
170         return sret != 1;
171 }
172
173 int qword_printhex(FILE *f, char *str, int slen)
174 {
175         char *bp = qword_buf;
176         int len = sizeof(qword_buf);
177         size_t sret;
178
179         qword_addhex(&bp, &len, str, slen);
180         sret = fwrite(qword_buf, bp-qword_buf, 1, f);
181         /* XXX: */
182         memcpy(tmp_buf, qword_buf, bp-qword_buf);
183         tmp_buf[bp-qword_buf] = '\0';
184         printerr(2, "%s", tmp_buf);
185
186         return sret != 1;
187 }
188
189 void qword_printint(FILE *f, int num)
190 {
191         fprintf(f, "%d ", num);
192         printerr(2, "%d ", num);
193 }
194
195 int qword_eol(FILE *f)
196 {
197         int err;
198         fprintf(f,"\n");
199         err = fflush(f);
200         printerr(2, "\n");
201         return err;
202 }
203
204
205
206 #define isodigit(c) (isdigit(c) && c <= '7')
207 int qword_get(char **bpp, char *dest, int bufsize)
208 {
209         /* return bytes copied, or -1 on error */
210         char *bp = *bpp;
211         int len = 0;
212
213         while (*bp == ' ') bp++;
214
215         if (bp[0] == '\\' && bp[1] == 'x') {
216                 /* HEX STRING */
217                 bp += 2;
218                 while (isxdigit(bp[0]) && isxdigit(bp[1]) && len < bufsize) {
219                         int byte = isdigit(*bp) ? *bp-'0' : toupper(*bp)-'A'+10;
220                         bp++;
221                         byte <<= 4;
222                         byte |= isdigit(*bp) ? *bp-'0' : toupper(*bp)-'A'+10;
223                         *dest++ = byte;
224                         bp++;
225                         len++;
226                 }
227         } else {
228                 /* text with \nnn octal quoting */
229                 while (*bp != ' ' && *bp != '\n' && *bp && len < bufsize-1) {
230                         if (*bp == '\\' &&
231                             isodigit(bp[1]) && (bp[1] <= '3') &&
232                             isodigit(bp[2]) &&
233                             isodigit(bp[3])) {
234                                 int byte = (*++bp -'0');
235                                 bp++;
236                                 byte = (byte << 3) | (*bp++ - '0');
237                                 byte = (byte << 3) | (*bp++ - '0');
238                                 *dest++ = byte;
239                                 len++;
240                         } else {
241                                 *dest++ = *bp++;
242                                 len++;
243                         }
244                 }
245         }
246
247         if (*bp != ' ' && *bp != '\n' && *bp != '\0')
248                 return -1;
249         while (*bp == ' ') bp++;
250         *bpp = bp;
251 // why should we clear *dest???
252 //      *dest = '\0';
253         return len;
254 }
255
256 int qword_get_int(char **bpp, int *anint)
257 {
258         char buf[50];
259         char *ep;
260         int rv;
261         int len = qword_get(bpp, buf, 50);
262         if (len < 0) return -1;
263         if (len ==0) return -1;
264         rv = strtol(buf, &ep, 0);
265         if (*ep) return -1;
266         *anint = rv;
267         return 0;
268 }
269
270 #define READLINE_BUFFER_INCREMENT 2048
271
272 int readline(int fd, char **buf, int *lenp)
273 {
274         /* read a line into *buf, which is malloced *len long
275          * realloc if needed until we find a \n
276          * nul out the \n and return
277          * 0 of eof, 1 of success
278          */
279         int len;
280
281         if (*lenp == 0) {
282                 char *b = malloc(READLINE_BUFFER_INCREMENT);
283                 if (b == NULL)
284                         return 0;
285                 *buf = b;
286                 *lenp = READLINE_BUFFER_INCREMENT;
287         }
288         len = read(fd, *buf, *lenp);
289         if (len <= 0) {
290                 printerr(0, "readline: read error: len %d errno %d (%s)\n",
291                          len, errno, strerror(errno));
292                 return 0;
293         }
294         while ((*buf)[len-1] != '\n') {
295         /* now the less common case.  There was no newline,
296          * so we have to keep reading after re-alloc
297          */
298                 char *new;
299                 int nl;
300                 *lenp += READLINE_BUFFER_INCREMENT;
301                 new = realloc(*buf, *lenp);
302                 if (new == NULL)
303                         return 0;
304                 *buf = new;
305                 nl = read(fd, *buf +len, *lenp - len);
306                 if (nl <= 0 ) {
307                         printerr(0, "readline: read error: len %d "
308                                  "errno %d (%s)\n", nl, errno, strerror(errno));
309                         return 0;
310                 }
311                 len += nl;
312         }
313         (*buf)[len-1] = 0;
314         printerr(3, "readline: read %d chars into buffer of size %d:\n%s\n",
315                  len, *lenp, *buf);
316         return 1;
317 }