diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 20:39:09 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 20:39:09 +0000 |
commit | 2387c426e6dfc2b0a2d0aa5585dbeb580f5ea91e (patch) | |
tree | 12721540663213a17c4c6a294f8f9473621fd503 /app/xdm/util.c | |
parent | dc4a2107be04f29ad06d6e60e102370bf68739cd (diff) |
Importing from X.Org 7.2RC2
Diffstat (limited to 'app/xdm/util.c')
-rw-r--r-- | app/xdm/util.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/app/xdm/util.c b/app/xdm/util.c new file mode 100644 index 000000000..c6172d48e --- /dev/null +++ b/app/xdm/util.c @@ -0,0 +1,278 @@ +/* $XdotOrg: app/xdm/util.c,v 1.5 2006/03/30 21:14:31 alanc Exp $ */ +/* $Xorg: util.c,v 1.4 2001/02/09 02:05:41 xorgcvs Exp $ */ +/* + +Copyright 1989, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* $XFree86: xc/programs/xdm/util.c,v 3.20 2002/05/31 18:46:10 dawes Exp $ */ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * util.c + * + * various utility routines + */ + +# include "dm.h" +# include "dm_error.h" + +#include <X11/Xmu/SysUtil.h> /* for XmuGetHostname */ + +#ifdef X_POSIX_C_SOURCE +#define _POSIX_C_SOURCE X_POSIX_C_SOURCE +#include <signal.h> +#undef _POSIX_C_SOURCE +#else +#if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE) +#include <signal.h> +#else +#define _POSIX_SOURCE +#include <signal.h> +#undef _POSIX_SOURCE +#endif +#endif + +void +printEnv (char **e) +{ + while (*e) + Debug ("%s\n", *e++); +} + +static char * +makeEnv (char *name, char *value) +{ + char *result; + + result = malloc ((unsigned) (strlen (name) + strlen (value) + 2)); + if (!result) { + LogOutOfMem ("makeEnv"); + return 0; + } + sprintf (result, "%s=%s", name, value); + return result; +} + +char * +getEnv (char **e, char *name) +{ + int l = strlen (name); + + if (!e) return 0; + + while (*e) { + if ((int)strlen (*e) > l && !strncmp (*e, name, l) && + (*e)[l] == '=') + return (*e) + l + 1; + ++e; + } + return 0; +} + +char ** +setEnv (char **e, char *name, char *value) +{ + char **new, **old; + char *newe; + int envsize; + int l; + + l = strlen (name); + newe = makeEnv (name, value); + if (!newe) { + LogOutOfMem ("setEnv"); + return e; + } + if (e) { + for (old = e; *old; old++) + if ((int)strlen (*old) > l && !strncmp (*old, name, l) && (*old)[l] == '=') + break; + if (*old) { + free (*old); + *old = newe; + return e; + } + envsize = old - e; + new = (char **) realloc ((char *) e, + (unsigned) ((envsize + 2) * sizeof (char *))); + } else { + envsize = 0; + new = (char **) malloc (2 * sizeof (char *)); + } + if (!new) { + LogOutOfMem ("setEnv"); + free (newe); + return e; + } + new[envsize] = newe; + new[envsize+1] = 0; + return new; +} + +char ** +putEnv(const char *string, char **env) +{ + char *v, *b, *n; + int nl; + + if ((b = strchr(string, '=')) == NULL) + return NULL; + v = b + 1; + + nl = b - string; + if ((n = malloc(nl + 1)) == NULL) + { + LogOutOfMem ("putAllEnv"); + return NULL; + } + + strncpy(n, string,nl + 1); + n[nl] = 0; + + env = setEnv(env,n,v); + free(n); + return env; +} + +void +freeEnv (char **env) +{ + char **e; + + if (env) + { + for (e = env; *e; e++) + free (*e); + free (env); + } +} + +# define isblank(c) ((c) == ' ' || c == '\t') + +char ** +parseArgs (char **argv, char *string) +{ + char *word; + char *save; + char **newargv; + int i; + + i = 0; + while (argv && argv[i]) + ++i; + if (!argv) { + argv = (char **) malloc (sizeof (char *)); + if (!argv) { + LogOutOfMem ("parseArgs"); + return 0; + } + } + word = string; + for (;;) { + if (!*string || isblank (*string)) { + if (word != string) { + newargv = (char **) realloc ((char *) argv, + (unsigned) ((i + 2) * sizeof (char *))); + save = malloc ((unsigned) (string - word + 1)); + if (!newargv || !save) { + LogOutOfMem ("parseArgs"); + free ((char *) argv); + if (save) + free (save); + return 0; + } else { + argv = newargv; + } + argv[i] = strncpy (save, word, string-word); + argv[i][string-word] = '\0'; + i++; + } + if (!*string) + break; + word = string + 1; + } + ++string; + } + argv[i] = 0; + return argv; +} + +void +freeArgs (char **argv) +{ + char **a; + + if (!argv) + return; + + for (a = argv; *a; a++) + free (*a); + free ((char *) argv); +} + +void +CleanUpChild (void) +{ + setsid(); +#ifdef SIGCHLD + (void) Signal (SIGCHLD, SIG_DFL); +#endif + (void) Signal (SIGTERM, SIG_DFL); + (void) Signal (SIGPIPE, SIG_DFL); + (void) Signal (SIGALRM, SIG_DFL); + (void) Signal (SIGHUP, SIG_DFL); + CloseOnFork (); +} + +static char localHostbuf[256]; +static int gotLocalHostname; + +char * +localHostname (void) +{ + if (!gotLocalHostname) + { + XmuGetHostname (localHostbuf, sizeof (localHostbuf) - 1); + gotLocalHostname = 1; + } + return localHostbuf; +} + +SIGVAL (*Signal (int sig, SIGFUNC handler))(int) +{ +#if !defined(X_NOT_POSIX) && !defined(__UNIXOS2__) + struct sigaction sigact, osigact; + sigact.sa_handler = handler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(sig, &sigact, &osigact); + return osigact.sa_handler; +#else + return signal(sig, handler); +#endif +} |