Added SILC Thread Queue API
[silc.git] / lib / silcutil / unix / silcunixutil.c
index 79e1185cb4505df0dbe0ee652c649858c6d2756a..ef608f92e54b699f18f489f2a0776040bc300b37 100644 (file)
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2001 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; either version 2 of the License, or
-  (at your option) any later version.
-  
+  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++;
-
-  regex = silc_calloc(len + count, sizeof(*regex));
-
-  count = 0;
-  regex[count] = '(';
-  count++;
-
-  for (i = 0; i < len; i++) {
-    if (string[i] == '*' || string[i] == '?') {
-      regex[count] = '.';
-      count++;
-    } else if (string[i] == ',') {
-      regex[count] = '|';
-      count++;
-      continue;
-    }
-
-    regex[count] = string[i];
-    count++;
-  }
-
-  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;
-
-  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. */
@@ -127,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();
@@ -135,17 +33,15 @@ char *silc_get_username()
       struct passwd *pw;
 
       pw = getpwuid(getuid());
-      if (!pw) {
-       fprintf(stderr, "silc_get_username: %s\n", strerror(errno));
-       return NULL;
-      }
-      
+      if (!pw)
+       return strdup("foo");
+
       logname = pw->pw_name;
     }
   }
-  
+
   return strdup(logname);
-}                          
+}
 
 /* Returns the real name of ther user. */
 
@@ -153,16 +49,17 @@ char *silc_get_real_name()
 {
   char *realname = NULL;
   struct passwd *pw;
-    
+
   pw = getpwuid(getuid());
-  if (!pw) {
-    fprintf(stderr, "silc_get_username: %s\n", strerror(errno));
-    return NULL;
-  }
+  if (!pw)
+    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;
@@ -172,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);
 }