X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Funix%2Fsilcunixutil.c;h=ef608f92e54b699f18f489f2a0776040bc300b37;hp=300beff0b391571d13d637c87de9ec13d3c46a9b;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hpb=0f0340b9fbce9704cc7171f8f0104ce9103d2de6 diff --git a/lib/silcutil/unix/silcunixutil.c b/lib/silcutil/unix/silcunixutil.c index 300beff0..ef608f92 100644 --- a/lib/silcutil/unix/silcunixutil.c +++ b/lib/silcutil/unix/silcunixutil.c @@ -4,128 +4,20 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2005 Pekka Riikonen + Copyright (C) 1997 - 2007 Pekka Riikonen This program is free 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; version 2 of the License. - + 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. */ -/* - * These are general utility functions that doesn't belong to any specific - * group of routines. - */ -/* $Id$ */ - -#include "silcincludes.h" - -/* XXX lib/contrib/regex.c might cmopile on WIN32 as well */ - -/* Inspects the `string' for wildcards and returns regex string that can - be used by the GNU regex library. A comma (`,') in the `string' means - that the string is list. */ - -char *silc_string_regexify(const char *string) -{ - int i, len, count; - char *regex; - - len = strlen(string); - count = 4; - for (i = 0; i < len; i++) { - if (string[i] == '*' || string[i] == '?') - count++; /* Will add '.' */ - if (string[i] == ',') - count += 2; /* Will add '|' and '^' */ - } - - regex = silc_calloc(len + count + 1, sizeof(*regex)); - - count = 0; - regex[count++] = '('; - regex[count++] = '^'; - - for (i = 0; i < len; i++) { - if (string[i] == '*' || string[i] == '?') { - regex[count] = '.'; - count++; - } else if (string[i] == ',') { - if (i + 2 == len) - continue; - regex[count++] = '|'; - regex[count++] = '^'; - continue; - } - - regex[count++] = string[i]; - } - - regex[count++] = ')'; - regex[count] = '$'; - - return regex; -} - -/* Combines two regex strings into one regex string so that they can be - used as one by the GNU regex library. The `string2' is combine into - the `string1'. */ - -char *silc_string_regex_combine(const char *string1, const char *string2) -{ - char *tmp; - int len1, len2; - - len1 = strlen(string1); - len2 = strlen(string2); - - tmp = silc_calloc(2 + len1 + len2, sizeof(*tmp)); - strncat(tmp, string1, len1 - 2); - strncat(tmp, "|", 1); - strncat(tmp, string2 + 1, len2 - 1); - - return tmp; -} - -/* Matches the two strings and returns TRUE if the strings match. */ - -int silc_string_regex_match(const char *regex, const char *string) -{ - regex_t preg; - int ret = FALSE; - - if (regcomp(&preg, regex, REG_NOSUB | REG_EXTENDED) != 0) - return FALSE; - - if (regexec(&preg, string, 0, NULL, 0) == 0) - ret = TRUE; - - regfree(&preg); - - return ret; -} - -/* Do regex match to the two strings `string1' and `string2'. If the - `string2' matches the `string1' this returns TRUE. */ - -int silc_string_match(const char *string1, const char *string2) -{ - char *s1; - int ret = FALSE; - if (!string1 || !string2) - return ret; - - s1 = silc_string_regexify(string1); - ret = silc_string_regex_match(s1, string2); - silc_free(s1); - - return ret; -} +#include "silc.h" /* Returns the username of the user. If the global variable LOGNAME does not exists we will get the name from the password file. */ @@ -133,7 +25,7 @@ int silc_string_match(const char *string1, const char *string2) char *silc_get_username() { char *logname = NULL; - + logname = getenv("LOGNAME"); if (!logname) { logname = getlogin(); @@ -147,7 +39,7 @@ char *silc_get_username() logname = pw->pw_name; } } - + return strdup(logname); } @@ -157,14 +49,17 @@ char *silc_get_real_name() { char *realname = NULL; struct passwd *pw; - + pw = getpwuid(getuid()); if (!pw) - return strdup("Foo T. Bar"); + return strdup("No Name"); if (strchr(pw->pw_gecos, ',')) *strchr(pw->pw_gecos, ',') = 0; + if (!strlen(pw->pw_gecos)) + return strdup("No Name"); + realname = strdup(pw->pw_gecos); return realname; @@ -174,5 +69,19 @@ char *silc_get_real_name() int silc_gettimeofday(struct timeval *p) { +#if defined(HAVE_CLOCK_GETTIME) + struct timespec tp; + if (clock_gettime(CLOCK_REALTIME, &tp)) + return -1; + p->tv_sec = tp.tv_sec; + p->tv_usec = tp.tv_nsec / 1000; + return 0; +#else return gettimeofday(p, NULL); +#endif /* HAVE_CLOCK_GETTIME */ +} + +int silc_file_set_nonblock(int fd) +{ + return fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); }