130 lines
3.3 KiB
C
130 lines
3.3 KiB
C
/* $Xorg: misc.c,v 1.4 2001/02/09 02:06:01 xorgcvs Exp $ */
|
||
/******************************************************************************
|
||
|
||
Copyright 1993, 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/xsm/misc.c,v 1.5 2001/07/25 15:05:29 dawes Exp $ */
|
||
|
||
#include "xsm.h"
|
||
|
||
|
||
#ifndef HAVE_PUTENV
|
||
/*
|
||
* define our own putenv() if the system doesn't have one.
|
||
* putenv(s): place s (a string of the form "NAME=value") in
|
||
* the environment; replacing any existing NAME. s is placed in
|
||
* environment, so if you change s, the environment changes (like
|
||
* putenv on a sun). Binding removed if you putenv something else
|
||
* called NAME.
|
||
*/
|
||
int
|
||
putenv(char *s)
|
||
{
|
||
char *v;
|
||
int varlen, idx;
|
||
char **newenv;
|
||
static int virgin = 1; /* true while "environ" is a virgin */
|
||
|
||
v = strchr(s, '=');
|
||
if(v == 0)
|
||
return 0; /* punt if it's not of the right form */
|
||
varlen = (v + 1) - s;
|
||
|
||
for (idx = 0; environ[idx] != 0; idx++) {
|
||
if (strncmp(environ[idx], s, varlen) == 0) {
|
||
if(v[1] != 0) { /* true if there's a value */
|
||
environ[idx] = s;
|
||
return 0;
|
||
} else {
|
||
do {
|
||
environ[idx] = environ[idx+1];
|
||
} while(environ[++idx] != 0);
|
||
return 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
/* add to environment (unless no value; then just return) */
|
||
if(v[1] == 0)
|
||
return 0;
|
||
if(virgin) {
|
||
register i;
|
||
|
||
newenv = (char **) XtMalloc((unsigned) ((idx + 2) * sizeof(char*)));
|
||
if(newenv == 0)
|
||
return -1;
|
||
for(i = idx-1; i >= 0; --i)
|
||
newenv[i] = environ[i];
|
||
virgin = 0; /* you're not a virgin anymore, sweety */
|
||
} else {
|
||
newenv = (char **) realloc((char *) environ,
|
||
(unsigned) ((idx + 2) * sizeof(char*)));
|
||
if (newenv == 0)
|
||
return -1;
|
||
}
|
||
|
||
environ = newenv;
|
||
environ[idx] = s;
|
||
environ[idx+1] = 0;
|
||
|
||
return 0;
|
||
}
|
||
|
||
#endif /* NOPUTENV */
|
||
|
||
|
||
|
||
int
|
||
strbw(const char *a, const char *b)
|
||
{
|
||
return !strncmp (a, b, strlen (b));
|
||
}
|
||
|
||
|
||
|
||
#if defined(sun) && defined(SVR4)
|
||
#include <sys/wait.h>
|
||
|
||
int
|
||
System(char *s)
|
||
{
|
||
int pid, status;
|
||
if ((pid = fork ()) == 0) {
|
||
(void) setpgrp();
|
||
execl ("/bin/sh", "sh", "-c", s, NULL);
|
||
} else
|
||
waitpid (pid, &status, 0);
|
||
return status;
|
||
}
|
||
#endif
|
||
|
||
|
||
|
||
void
|
||
nomem(void)
|
||
{
|
||
fprintf (stderr, "Insufficient memory.\n");
|
||
exit (255);
|
||
}
|
||
|