X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Ftools.c;h=43a7882303921c94ceab0ff3ad5880bf8170fe1d;hb=1280d6bb4910e2020c3ff9121ebe468622f88079;hp=35871b67701bc82bf3446fab7e2425b5d8be076b;hpb=b063c5c8c89de1e8586dae1c6fade1e68f371165;p=citadel.git diff --git a/libcitadel/lib/tools.c b/libcitadel/lib/tools.c index 35871b677..43a788230 100644 --- a/libcitadel/lib/tools.c +++ b/libcitadel/lib/tools.c @@ -1,6 +1,22 @@ /* * A basic toolset containing miscellaneous functions for string manipluation, * encoding/decoding, and a bunch of other stuff. + * + * Copyright (c) 1987-2011 by the citadel.org team + * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ @@ -772,40 +788,29 @@ int stripout(char *str, char leftboundary, char rightboundary) { * parentheses and anything outside them). */ long stripallbut(char *str, char leftboundary, char rightboundary) { - int a; - long orglen, len; - char *pchs; - long min; - - orglen = len = strlen(str); - pchs = NULL; - for (a = 0; a < len; ++ a) { - if (str[a] == leftboundary) - pchs = &str[a+1]; - } - - if (pchs == NULL) - min = 0; - else - min = pchs - str; - - for (a = min; a < len; ++ a) { - if (str[a] == rightboundary) - len = a - 1; + long len = 0; + + char *lb = NULL; + char *rb = NULL; + + lb = strrchr(str, leftboundary); + if (lb != NULL) { + ++lb; + rb = strchr(str, rightboundary); + if ((rb != NULL) && (rb >= lb)) { + *rb = 0; + fflush(stderr); + len = (long)rb - (long)lb; + memmove(str, lb, len); + str[len] = 0; + return(len); + } } - if (len != orglen) - str[len] = '\0'; - if (pchs != NULL) - { - orglen = len - min; - memmove(str, pchs, orglen); - return orglen; - } - else - return len; + return (long)strlen(str); } + char *myfgets(char *s, int size, FILE *stream) { char *ret = fgets(s, size, stream); char *nl; @@ -869,12 +874,38 @@ char *strcpy(char *dest, const char *src) { * Generate a new, globally unique UID parameter for a calendar etc. object */ void generate_uuid(char *buf) { - static int seq = 0; + static int seq = (-1); + static int no_kernel_uuid = 0; + + /* If we are running on Linux then we have a kernelspace uuid generator available */ + + if (no_kernel_uuid == 0) { + FILE *fp; + fp = fopen("/proc/sys/kernel/random/uuid", "rb"); + if (fp) { + int rv; + rv = fread(buf, 36, 1, fp); + fclose(fp); + if (rv == 1) return; + } + } + + /* If the kernel didn't provide us with a uuid, we generate a pseudo-random one */ + + no_kernel_uuid = 1; + + if (seq == (-1)) { + seq = (int)rand(); + } + ++seq; + seq = (seq % 0x0FFF) ; - sprintf(buf, "%lx-%lx-%x", - time(NULL), + sprintf(buf, "%08lx-%04lx-4%03x-a%03x-%012lx", + (long)time(NULL), (long)getpid(), - (seq++) + seq, + seq, + (long)rand() ); }