/* silcunixutil.c Author: Pekka Riikonen Copyright (C) 1997 - 2000 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. 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 - 1] = ')'; 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; } /* Returns the username of the user. If the global variable LOGNAME does not exists we will get the name from the password file. */ char *silc_get_username() { char *logname = NULL; logname = getenv("LOGNAME"); if (!logname) { logname = getlogin(); if (!logname) { struct passwd *pw; pw = getpwuid(getuid()); if (!pw) { fprintf(stderr, "silc_get_username: %s\n", strerror(errno)); return NULL; } logname = pw->pw_name; } } return strdup(logname); } /* Returns the real name of ther user. */ 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 (strchr(pw->pw_gecos, ',')) *strchr(pw->pw_gecos, ',') = 0; realname = strdup(pw->pw_gecos); return realname; }