b1ed43669c0618fefa8b1406223541fa05ec2f6d
[samba.git] / source3 / lib / util_str.c
1 /*
2    Unix SMB/CIFS implementation.
3    Samba utility functions
4
5    Copyright (C) Andrew Tridgell 1992-2001
6    Copyright (C) Simo Sorce      2001-2002
7    Copyright (C) Martin Pool     2003
8    Copyright (C) James Peach     2006
9    Copyright (C) Jeremy Allison  1992-2007
10
11    This program is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3 of the License, or
14    (at your option) any later version.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program.  If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 #include "includes.h"
26 #include "lib/param/loadparm.h"
27 #include "lib/util/smb_strtox.h"
28
29 static const char toupper_ascii_fast_table[128] = {
30         0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
31         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
32         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
33         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
34         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
35         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
36         0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
37         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
38 };
39
40 /**
41  * Compare 2 strings up to and including the nth char.
42  *
43  * @note The comparison is case-insensitive.
44  **/
45 bool strnequal(const char *s1,const char *s2,size_t n)
46 {
47         if (s1 == s2)
48                 return(true);
49         if (!s1 || !s2 || !n)
50                 return(false);
51
52         return(strncasecmp_m(s1,s2,n)==0);
53 }
54
55 /**
56  Convert a string to "normal" form.
57 **/
58
59 bool strnorm(char *s, int case_default)
60 {
61         if (case_default == CASE_UPPER)
62                 return strupper_m(s);
63         else
64                 return strlower_m(s);
65 }
66
67 /**
68  Skip past a string in a buffer. Buffer may not be
69  null terminated. end_ptr points to the first byte after
70  then end of the buffer.
71 **/
72
73 char *skip_string(const char *base, size_t len, char *buf)
74 {
75         const char *end_ptr = base + len;
76
77         if (end_ptr < base || !base || !buf || buf >= end_ptr) {
78                 return NULL;
79         }
80
81         /* Skip the string */
82         while (*buf) {
83                 buf++;
84                 if (buf >= end_ptr) {
85                         return NULL;
86                 }
87         }
88         /* Skip the '\0' */
89         buf++;
90         return buf;
91 }
92
93 /**
94  Count the number of characters in a string. Normally this will
95  be the same as the number of bytes in a string for single byte strings,
96  but will be different for multibyte.
97 **/
98
99 size_t str_charnum(const char *s)
100 {
101         size_t ret, converted_size;
102         smb_ucs2_t *tmpbuf2 = NULL;
103         if (!push_ucs2_talloc(talloc_tos(), &tmpbuf2, s, &converted_size)) {
104                 return 0;
105         }
106         ret = strlen_w(tmpbuf2);
107         TALLOC_FREE(tmpbuf2);
108         return ret;
109 }
110
111 bool trim_char(char *s,char cfront,char cback)
112 {
113         bool ret = false;
114         char *ep;
115         char *fp = s;
116
117         /* Ignore null or empty strings. */
118         if (!s || (s[0] == '\0'))
119                 return false;
120
121         if (cfront) {
122                 while (*fp && *fp == cfront)
123                         fp++;
124                 if (!*fp) {
125                         /* We ate the string. */
126                         s[0] = '\0';
127                         return true;
128                 }
129                 if (fp != s)
130                         ret = true;
131         }
132
133         ep = fp + strlen(fp) - 1;
134         if (cback) {
135                 /* Attempt ascii only. Bail for mb strings. */
136                 while ((ep >= fp) && (*ep == cback)) {
137                         ret = true;
138                         if ((ep > fp) && (((unsigned char)ep[-1]) & 0x80)) {
139                                 /* Could be mb... bail back to tim_string. */
140                                 char fs[2], bs[2];
141                                 if (cfront) {
142                                         fs[0] = cfront;
143                                         fs[1] = '\0';
144                                 }
145                                 bs[0] = cback;
146                                 bs[1] = '\0';
147                                 return trim_string(s, cfront ? fs : NULL, bs);
148                         } else {
149                                 ep--;
150                         }
151                 }
152                 if (ep < fp) {
153                         /* We ate the string. */
154                         s[0] = '\0';
155                         return true;
156                 }
157         }
158
159         ep[1] = '\0';
160         memmove(s, fp, ep-fp+2);
161         return ret;
162 }
163
164 /**
165  Check if a string is part of a list.
166 **/
167
168 bool in_list(const char *s, const char *list, bool casesensitive)
169 {
170         char *tok = NULL;
171         bool ret = false;
172         TALLOC_CTX *frame;
173
174         if (!list) {
175                 return false;
176         }
177
178         frame = talloc_stackframe();
179         while (next_token_talloc(frame, &list, &tok,LIST_SEP)) {
180                 if (casesensitive) {
181                         if (strcmp(tok,s) == 0) {
182                                 ret = true;
183                                 break;
184                         }
185                 } else {
186                         if (strcasecmp_m(tok,s) == 0) {
187                                 ret = true;
188                                 break;
189                         }
190                 }
191         }
192         TALLOC_FREE(frame);
193         return ret;
194 }
195
196 /**
197  Write an octal as a string.
198 **/
199
200 char *octal_string(int i)
201 {
202         char *result;
203         if (i == -1) {
204                 result = talloc_strdup(talloc_tos(), "-1");
205         }
206         else {
207                 result = talloc_asprintf(talloc_tos(), "0%o", i);
208         }
209         SMB_ASSERT(result != NULL);
210         return result;
211 }
212
213
214 /**
215  Truncate a string at a specified length.
216 **/
217
218 char *string_truncate(char *s, unsigned int length)
219 {
220         if (s && strlen(s) > length)
221                 s[length] = 0;
222         return s;
223 }
224
225
226 /***********************************************************************
227  Return the equivalent of doing strrchr 'n' times - always going
228  backwards.
229 ***********************************************************************/
230
231 char *strnrchr_m(const char *s, char c, unsigned int n)
232 {
233         smb_ucs2_t *ws = NULL;
234         char *s2 = NULL;
235         smb_ucs2_t *p;
236         char *ret;
237         size_t converted_size;
238
239         if (!push_ucs2_talloc(talloc_tos(), &ws, s, &converted_size)) {
240                 /* Too hard to try and get right. */
241                 return NULL;
242         }
243         p = strnrchr_w(ws, UCS2_CHAR(c), n);
244         if (!p) {
245                 TALLOC_FREE(ws);
246                 return NULL;
247         }
248         *p = 0;
249         if (!pull_ucs2_talloc(talloc_tos(), &s2, ws, &converted_size)) {
250                 TALLOC_FREE(ws);
251                 /* Too hard to try and get right. */
252                 return NULL;
253         }
254         ret = discard_const_p(char, (s+strlen(s2)));
255         TALLOC_FREE(ws);
256         TALLOC_FREE(s2);
257         return ret;
258 }
259
260 static bool unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen)
261 {
262         size_t size;
263         smb_ucs2_t *buffer = NULL;
264         bool ret;
265
266         if (!convert_string_talloc(talloc_tos(), CH_UNIX, CH_UTF16LE, src, srclen,
267                                    (void **)(void *)&buffer, &size))
268         {
269                 return false;
270         }
271         if (!strlower_w(buffer) && (dest == src)) {
272                 TALLOC_FREE(buffer);
273                 return true;
274         }
275         ret = convert_string(CH_UTF16LE, CH_UNIX, buffer, size, dest, destlen, &size);
276         TALLOC_FREE(buffer);
277         return ret;
278 }
279
280 #if 0 /* Alternate function that avoid talloc calls for ASCII and non ASCII */
281
282 /**
283  Convert a string to lower case.
284 **/
285 _PUBLIC_ void strlower_m(char *s)
286 {
287         char *d;
288         struct smb_iconv_handle *iconv_handle;
289
290         iconv_handle = get_iconv_handle();
291
292         d = s;
293
294         while (*s) {
295                 size_t c_size, c_size2;
296                 codepoint_t c = next_codepoint_handle(iconv_handle, s, &c_size);
297                 c_size2 = push_codepoint_handle(iconv_handle, d, tolower_m(c));
298                 if (c_size2 > c_size) {
299                         DEBUG(0,("FATAL: codepoint 0x%x (0x%x) expanded from %d to %d bytes in strlower_m\n",
300                                  c, tolower_m(c), (int)c_size, (int)c_size2));
301                         smb_panic("codepoint expansion in strlower_m\n");
302                 }
303                 s += c_size;
304                 d += c_size2;
305         }
306         *d = 0;
307 }
308
309 #endif
310
311 /**
312  Convert a string to lower case.
313 **/
314
315 bool strlower_m(char *s)
316 {
317         size_t len;
318         int errno_save;
319         bool ret = false;
320
321         /* this is quite a common operation, so we want it to be
322            fast. We optimise for the ascii case, knowing that all our
323            supported multi-byte character sets are ascii-compatible
324            (ie. they match for the first 128 chars) */
325
326         while (*s && !(((unsigned char)s[0]) & 0x80)) {
327                 *s = tolower_m((unsigned char)*s);
328                 s++;
329         }
330
331         if (!*s)
332                 return true;
333
334         /* I assume that lowercased string takes the same number of bytes
335          * as source string even in UTF-8 encoding. (VIV) */
336         len = strlen(s) + 1;
337         errno_save = errno;
338         errno = 0;
339         ret = unix_strlower(s,len,s,len);
340         /* Catch mb conversion errors that may not terminate. */
341         if (errno) {
342                 s[len-1] = '\0';
343         }
344         errno = errno_save;
345         return ret;
346 }
347
348 static bool unix_strupper(const char *src, size_t srclen, char *dest, size_t destlen)
349 {
350         size_t size;
351         smb_ucs2_t *buffer;
352         bool ret;
353
354         if (!push_ucs2_talloc(talloc_tos(), &buffer, src, &size)) {
355                 return false;
356         }
357
358         if (!strupper_w(buffer) && (dest == src)) {
359                 TALLOC_FREE(buffer);
360                 return true;
361         }
362
363         ret = convert_string(CH_UTF16LE, CH_UNIX, buffer, size, dest, destlen, &size);
364         TALLOC_FREE(buffer);
365         return ret;
366 }
367
368 #if 0 /* Alternate function that avoid talloc calls for ASCII and non ASCII */
369
370 /**
371  Convert a string to UPPER case.
372 **/
373 _PUBLIC_ void strupper_m(char *s)
374 {
375         char *d;
376         struct smb_iconv_handle *iconv_handle;
377
378         iconv_handle = get_iconv_handle();
379
380         d = s;
381
382         while (*s) {
383                 size_t c_size, c_size2;
384                 codepoint_t c = next_codepoint_handle(iconv_handle, s, &c_size);
385                 c_size2 = push_codepoint_handle(iconv_handle, d, toupper_m(c));
386                 if (c_size2 > c_size) {
387                         DEBUG(0,("FATAL: codepoint 0x%x (0x%x) expanded from %d to %d bytes in strupper_m\n",
388                                  c, toupper_m(c), (int)c_size, (int)c_size2));
389                         smb_panic("codepoint expansion in strupper_m\n");
390                 }
391                 s += c_size;
392                 d += c_size2;
393         }
394         *d = 0;
395 }
396
397 #endif
398
399 /**
400  Convert a string to upper case.
401 **/
402
403 bool strupper_m(char *s)
404 {
405         size_t len;
406         bool ret = false;
407
408         /* this is quite a common operation, so we want it to be
409            fast. We optimise for the ascii case, knowing that all our
410            supported multi-byte character sets are ascii-compatible
411            (ie. they match for the first 128 chars) */
412
413         while (*s && !(((unsigned char)s[0]) & 0x80)) {
414                 *s = toupper_ascii_fast_table[(unsigned char)s[0]];
415                 s++;
416         }
417
418         if (!*s)
419                 return true;
420
421         /* I assume that uppercased string takes the same number of bytes
422          * as source string even in multibyte encoding. (VIV) */
423         len = strlen(s) + 1;
424         ret = unix_strupper(s,len,s,len);
425         /* Catch mb conversion errors that may not terminate. */
426         if (!ret) {
427                 s[len-1] = '\0';
428         }
429         return ret;
430 }
431
432 /**
433  Just a typesafety wrapper for snprintf into a fstring.
434 **/
435
436 int fstr_sprintf(fstring s, const char *fmt, ...)
437 {
438         va_list ap;
439         int ret;
440
441         va_start(ap, fmt);
442         ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
443         va_end(ap);
444         return ret;
445 }
446
447 /* read a SMB_BIG_UINT from a string */
448 uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
449 {
450
451         uint64_t val = (uint64_t)-1;
452         const char *p = nptr;
453
454         if (!p) {
455                 if (entptr) {
456                         *entptr = p;
457                 }
458                 return val;
459         }
460
461         while (*p && isspace(*p))
462                 p++;
463
464         sscanf(p,"%"SCNu64,&val);
465         if (entptr) {
466                 while (*p && isdigit(*p))
467                         p++;
468                 *entptr = p;
469         }
470
471         return val;
472 }
473
474 /* Convert a size specification to a count of bytes. We accept the following
475  * suffixes:
476  *          bytes if there is no suffix
477  *      kK  kibibytes
478  *      mM  mebibytes
479  *      gG  gibibytes
480  *      tT  tibibytes
481  *      pP  whatever the ISO name for petabytes is
482  *
483  *  Returns 0 if the string can't be converted.
484  */
485 uint64_t conv_str_size(const char * str)
486 {
487         uint64_t lval;
488         char *end;
489         int error = 0;
490
491         if (str == NULL || *str == '\0') {
492                 return 0;
493         }
494
495         lval = smb_strtoull(str, &end, 10, &error, SMB_STR_STANDARD);
496
497         if (error != 0) {
498                 return 0;
499         }
500
501         if (*end == '\0') {
502                 return lval;
503         }
504
505         if (strwicmp(end, "K") == 0) {
506                 lval *= 1024ULL;
507         } else if (strwicmp(end, "M") == 0) {
508                 lval *= (1024ULL * 1024ULL);
509         } else if (strwicmp(end, "G") == 0) {
510                 lval *= (1024ULL * 1024ULL *
511                          1024ULL);
512         } else if (strwicmp(end, "T") == 0) {
513                 lval *= (1024ULL * 1024ULL *
514                          1024ULL * 1024ULL);
515         } else if (strwicmp(end, "P") == 0) {
516                 lval *= (1024ULL * 1024ULL *
517                          1024ULL * 1024ULL *
518                          1024ULL);
519         } else {
520                 return 0;
521         }
522
523         return lval;
524 }
525
526 char *talloc_asprintf_strupper_m(TALLOC_CTX *t, const char *fmt, ...)
527 {
528         va_list ap;
529         char *ret;
530
531         va_start(ap, fmt);
532         ret = talloc_vasprintf(t, fmt, ap);
533         va_end(ap);
534
535         if (ret == NULL) {
536                 return NULL;
537         }
538         if (!strupper_m(ret)) {
539                 TALLOC_FREE(ret);
540                 return NULL;
541         }
542         return ret;
543 }
544
545 char *talloc_asprintf_strlower_m(TALLOC_CTX *t, const char *fmt, ...)
546 {
547         va_list ap;
548         char *ret;
549
550         va_start(ap, fmt);
551         ret = talloc_vasprintf(t, fmt, ap);
552         va_end(ap);
553
554         if (ret == NULL) {
555                 return NULL;
556         }
557         if (!strlower_m(ret)) {
558                 TALLOC_FREE(ret);
559                 return NULL;
560         }
561         return ret;
562 }
563
564
565 /********************************************************************
566  Check a string for any occurrences of a specified list of invalid
567  characters.
568 ********************************************************************/
569
570 bool validate_net_name( const char *name,
571                 const char *invalid_chars,
572                 int max_len)
573 {
574         int i;
575
576         if (!name) {
577                 return false;
578         }
579
580         for ( i=0; i<max_len && name[i]; i++ ) {
581                 /* fail if strchr_m() finds one of the invalid characters */
582                 if ( name[i] && strchr_m( invalid_chars, name[i] ) ) {
583                         return false;
584                 }
585         }
586
587         return true;
588 }
589
590
591 /*******************************************************************
592  Add a shell escape character '\' to any character not in a known list
593  of characters. UNIX charset format.
594 *******************************************************************/
595
596 #define INCLUDE_LIST "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_/ \t.,"
597 #define INSIDE_DQUOTE_LIST "$`\n\"\\"
598
599 char *escape_shell_string(const char *src)
600 {
601         size_t srclen = strlen(src);
602         char *ret = SMB_MALLOC_ARRAY(char, (srclen * 2) + 1);
603         char *dest = ret;
604         bool in_s_quote = false;
605         bool in_d_quote = false;
606         bool next_escaped = false;
607
608         if (!ret) {
609                 return NULL;
610         }
611
612         while (*src) {
613                 size_t c_size;
614                 codepoint_t c = next_codepoint(src, &c_size);
615
616                 if (c == INVALID_CODEPOINT) {
617                         SAFE_FREE(ret);
618                         return NULL;
619                 }
620
621                 if (c_size > 1) {
622                         memcpy(dest, src, c_size);
623                         src += c_size;
624                         dest += c_size;
625                         next_escaped = false;
626                         continue;
627                 }
628
629                 /*
630                  * Deal with backslash escaped state.
631                  * This only lasts for one character.
632                  */
633
634                 if (next_escaped) {
635                         *dest++ = *src++;
636                         next_escaped = false;
637                         continue;
638                 }
639
640                 /*
641                  * Deal with single quote state. The
642                  * only thing we care about is exiting
643                  * this state.
644                  */
645
646                 if (in_s_quote) {
647                         if (*src == '\'') {
648                                 in_s_quote = false;
649                         }
650                         *dest++ = *src++;
651                         continue;
652                 }
653
654                 /*
655                  * Deal with double quote state. The most
656                  * complex state. We must cope with \, meaning
657                  * possibly escape next char (depending what it
658                  * is), ", meaning exit this state, and possibly
659                  * add an \ escape to any unprotected character
660                  * (listed in INSIDE_DQUOTE_LIST).
661                  */
662
663                 if (in_d_quote) {
664                         if (*src == '\\') {
665                                 /*
666                                  * Next character might be escaped.
667                                  * We have to peek. Inside double
668                                  * quotes only INSIDE_DQUOTE_LIST
669                                  * characters are escaped by a \.
670                                  */
671
672                                 char nextchar;
673
674                                 c = next_codepoint(&src[1], &c_size);
675                                 if (c == INVALID_CODEPOINT) {
676                                         SAFE_FREE(ret);
677                                         return NULL;
678                                 }
679                                 if (c_size > 1) {
680                                         /*
681                                          * Don't escape the next char.
682                                          * Just copy the \.
683                                          */
684                                         *dest++ = *src++;
685                                         continue;
686                                 }
687
688                                 nextchar = src[1];
689
690                                 if (nextchar && strchr(INSIDE_DQUOTE_LIST,
691                                                         (int)nextchar)) {
692                                         next_escaped = true;
693                                 }
694                                 *dest++ = *src++;
695                                 continue;
696                         }
697
698                         if (*src == '\"') {
699                                 /* Exit double quote state. */
700                                 in_d_quote = false;
701                                 *dest++ = *src++;
702                                 continue;
703                         }
704
705                         /*
706                          * We know the character isn't \ or ",
707                          * so escape it if it's any of the other
708                          * possible unprotected characters.
709                          */
710
711                         if (strchr(INSIDE_DQUOTE_LIST, (int)*src)) {
712                                 *dest++ = '\\';
713                         }
714                         *dest++ = *src++;
715                         continue;
716                 }
717
718                 /*
719                  * From here to the end of the loop we're
720                  * not in the single or double quote state.
721                  */
722
723                 if (*src == '\\') {
724                         /* Next character must be escaped. */
725                         next_escaped = true;
726                         *dest++ = *src++;
727                         continue;
728                 }
729
730                 if (*src == '\'') {
731                         /* Go into single quote state. */
732                         in_s_quote = true;
733                         *dest++ = *src++;
734                         continue;
735                 }
736
737                 if (*src == '\"') {
738                         /* Go into double quote state. */
739                         in_d_quote = true;
740                         *dest++ = *src++;
741                         continue;
742                 }
743
744                 /* Check if we need to escape the character. */
745
746                 if (!strchr(INCLUDE_LIST, (int)*src)) {
747                         *dest++ = '\\';
748                 }
749                 *dest++ = *src++;
750         }
751         *dest++ = '\0';
752         return ret;
753 }
754
755 /*
756  * This routine improves performance for operations temporarily acting on a
757  * full path. It is equivalent to the much more expensive
758  *
759  * talloc_asprintf(talloc_tos(), "%s/%s", dir, name)
760  *
761  * This actually does make a difference in metadata-heavy workloads (i.e. the
762  * "standard" client.txt nbench run.
763  */
764
765 ssize_t full_path_tos(const char *dir, const char *name,
766                       char *tmpbuf, size_t tmpbuf_len,
767                       char **pdst, char **to_free)
768 {
769         size_t dirlen, namelen, len;
770         char *dst;
771
772         dirlen = strlen(dir);
773         namelen = strlen(name);
774         len = dirlen + namelen + 1;
775
776         if (len < tmpbuf_len) {
777                 dst = tmpbuf;
778                 *to_free = NULL;
779         } else {
780                 dst = talloc_array(talloc_tos(), char, len+1);
781                 if (dst == NULL) {
782                         return -1;
783                 }
784                 *to_free = dst;
785         }
786
787         memcpy(dst, dir, dirlen);
788         dst[dirlen] = '/';
789         memcpy(dst+dirlen+1, name, namelen+1);
790         *pdst = dst;
791         return len;
792 }