aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/os/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/os/utils.c')
-rw-r--r--xorg-server/os/utils.c1666
1 files changed, 815 insertions, 851 deletions
diff --git a/xorg-server/os/utils.c b/xorg-server/os/utils.c
index 6461ed591..30592d2cc 100644
--- a/xorg-server/os/utils.c
+++ b/xorg-server/os/utils.c
@@ -24,7 +24,6 @@ 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.
-
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
Copyright 1994 Quarterdeck Office Systems.
@@ -99,19 +98,19 @@ __stdcall unsigned long GetTickCount(void);
#ifndef WIN32
#include <sys/wait.h>
#endif
-#if !defined(SYSV) && !defined(WIN32)
+#if !defined(SYSV) && !defined(WIN32)
#include <sys/resource.h>
#endif
#include <sys/stat.h>
-#include <ctype.h> /* for isspace */
+#include <ctype.h> /* for isspace */
#include <stdarg.h>
-#include <stdlib.h> /* for malloc() */
+#include <stdlib.h> /* for malloc() */
#if defined(TCPCONN) || defined(STREAMSCONN)
-# ifndef WIN32
-# include <netdb.h>
-# endif
+#ifndef WIN32
+#include <netdb.h>
+#endif
#endif
#include "opaque.h"
@@ -123,6 +122,7 @@ __stdcall unsigned long GetTickCount(void);
#include "picture.h"
Bool noTestExtensions;
+
#ifdef COMPOSITE
Bool noCompositeExtension = FALSE;
#endif
@@ -150,6 +150,7 @@ Bool noMITShmExtension = FALSE;
Bool noRRExtension = FALSE;
#endif
Bool noRenderExtension = FALSE;
+
#ifdef XCSECURITY
Bool noSecurityExtension = FALSE;
#endif
@@ -214,11 +215,11 @@ OsSignal(int sig, OsSigHandlerPtr handler)
sigemptyset(&act.sa_mask);
if (handler != SIG_IGN)
- sigaddset(&act.sa_mask, sig);
+ sigaddset(&act.sa_mask, sig);
act.sa_flags = 0;
act.sa_handler = handler;
if (sigaction(sig, &act, &oact))
- perror("sigaction");
+ perror("sigaction");
return oact.sa_handler;
}
@@ -246,121 +247,123 @@ static Bool nolock = FALSE;
void
LockServer(void)
{
- char tmp[PATH_MAX], pid_str[12];
- int lfd, i, haslock, l_pid, t;
- const char *tmppath = LOCK_DIR;
- int len;
- char port[20];
-
- if (nolock) return;
- /*
- * Path names
- */
- snprintf(port, sizeof(port), "%d", atoi(display));
- len = strlen(LOCK_PREFIX) > strlen(LOCK_TMP_PREFIX) ? strlen(LOCK_PREFIX) :
- strlen(LOCK_TMP_PREFIX);
- len += strlen(tmppath) + strlen(port) + strlen(LOCK_SUFFIX) + 1;
- if (len > sizeof(LockFile))
- FatalError("Display name `%s' is too long\n", port);
- (void)sprintf(tmp, "%s" LOCK_TMP_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
- (void)sprintf(LockFile, "%s" LOCK_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
-
- /*
- * Create a temporary file containing our PID. Attempt three times
- * to create the file.
- */
- StillLocking = TRUE;
- i = 0;
- do {
- i++;
- lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
- if (lfd < 0)
- sleep(2);
- else
- break;
- } while (i < 3);
- if (lfd < 0) {
- unlink(tmp);
+ char tmp[PATH_MAX], pid_str[12];
+ int lfd, i, haslock, l_pid, t;
+ const char *tmppath = LOCK_DIR;
+ int len;
+ char port[20];
+
+ if (nolock)
+ return;
+ /*
+ * Path names
+ */
+ snprintf(port, sizeof(port), "%d", atoi(display));
+ len = strlen(LOCK_PREFIX) > strlen(LOCK_TMP_PREFIX) ? strlen(LOCK_PREFIX) :
+ strlen(LOCK_TMP_PREFIX);
+ len += strlen(tmppath) + strlen(port) + strlen(LOCK_SUFFIX) + 1;
+ if (len > sizeof(LockFile))
+ FatalError("Display name `%s' is too long\n", port);
+ (void) sprintf(tmp, "%s" LOCK_TMP_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
+ (void) sprintf(LockFile, "%s" LOCK_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
+
+ /*
+ * Create a temporary file containing our PID. Attempt three times
+ * to create the file.
+ */
+ StillLocking = TRUE;
i = 0;
do {
- i++;
- lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
- if (lfd < 0)
- sleep(2);
- else
- break;
+ i++;
+ lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
+ if (lfd < 0)
+ sleep(2);
+ else
+ break;
} while (i < 3);
- }
- if (lfd < 0)
- FatalError("Could not create lock file in %s\n", tmp);
- snprintf(pid_str, sizeof(pid_str), "%10ld\n", (long)getpid());
- (void) write(lfd, pid_str, 11);
- (void) fchmod(lfd, 0444);
- (void) close(lfd);
-
- /*
- * OK. Now the tmp file exists. Try three times to move it in place
- * for the lock.
- */
- i = 0;
- haslock = 0;
- while ((!haslock) && (i++ < 3)) {
- haslock = (link(tmp,LockFile) == 0);
- if (haslock) {
- /*
- * We're done.
- */
- break;
- }
- else {
- /*
- * Read the pid from the existing file
- */
- lfd = open(LockFile, O_RDONLY|O_NOFOLLOW);
- if (lfd < 0) {
- unlink(tmp);
- FatalError("Can't read lock file %s\n", LockFile);
- }
- pid_str[0] = '\0';
- if (read(lfd, pid_str, 11) != 11) {
- /*
- * Bogus lock file.
- */
- unlink(LockFile);
- close(lfd);
- continue;
- }
- pid_str[11] = '\0';
- sscanf(pid_str, "%d", &l_pid);
- close(lfd);
-
- /*
- * Now try to kill the PID to see if it exists.
- */
- errno = 0;
- t = kill(l_pid, 0);
- if ((t< 0) && (errno == ESRCH)) {
- /*
- * Stale lock file.
- */
- unlink(LockFile);
- continue;
- }
- else if (((t < 0) && (errno == EPERM)) || (t == 0)) {
- /*
- * Process is still active.
- */
+ if (lfd < 0) {
unlink(tmp);
- FatalError("Server is already active for display %s\n%s %s\n%s\n",
- port, "\tIf this server is no longer running, remove",
- LockFile, "\tand start again.");
- }
+ i = 0;
+ do {
+ i++;
+ lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
+ if (lfd < 0)
+ sleep(2);
+ else
+ break;
+ } while (i < 3);
+ }
+ if (lfd < 0)
+ FatalError("Could not create lock file in %s\n", tmp);
+ snprintf(pid_str, sizeof(pid_str), "%10ld\n", (long) getpid());
+ (void) write(lfd, pid_str, 11);
+ (void) fchmod(lfd, 0444);
+ (void) close(lfd);
+
+ /*
+ * OK. Now the tmp file exists. Try three times to move it in place
+ * for the lock.
+ */
+ i = 0;
+ haslock = 0;
+ while ((!haslock) && (i++ < 3)) {
+ haslock = (link(tmp, LockFile) == 0);
+ if (haslock) {
+ /*
+ * We're done.
+ */
+ break;
+ }
+ else {
+ /*
+ * Read the pid from the existing file
+ */
+ lfd = open(LockFile, O_RDONLY | O_NOFOLLOW);
+ if (lfd < 0) {
+ unlink(tmp);
+ FatalError("Can't read lock file %s\n", LockFile);
+ }
+ pid_str[0] = '\0';
+ if (read(lfd, pid_str, 11) != 11) {
+ /*
+ * Bogus lock file.
+ */
+ unlink(LockFile);
+ close(lfd);
+ continue;
+ }
+ pid_str[11] = '\0';
+ sscanf(pid_str, "%d", &l_pid);
+ close(lfd);
+
+ /*
+ * Now try to kill the PID to see if it exists.
+ */
+ errno = 0;
+ t = kill(l_pid, 0);
+ if ((t < 0) && (errno == ESRCH)) {
+ /*
+ * Stale lock file.
+ */
+ unlink(LockFile);
+ continue;
+ }
+ else if (((t < 0) && (errno == EPERM)) || (t == 0)) {
+ /*
+ * Process is still active.
+ */
+ unlink(tmp);
+ FatalError
+ ("Server is already active for display %s\n%s %s\n%s\n",
+ port, "\tIf this server is no longer running, remove",
+ LockFile, "\tand start again.");
+ }
+ }
}
- }
- unlink(tmp);
- if (!haslock)
- FatalError("Could not create server lock file: %s\n", LockFile);
- StillLocking = FALSE;
+ unlink(tmp);
+ if (!haslock)
+ FatalError("Could not create server lock file: %s\n", LockFile);
+ StillLocking = FALSE;
}
/*
@@ -370,18 +373,19 @@ LockServer(void)
void
UnlockServer(void)
{
- if (nolock) return;
+ if (nolock)
+ return;
- if (!StillLocking){
+ if (!StillLocking) {
- (void) unlink(LockFile);
- }
+ (void) unlink(LockFile);
+ }
}
/* Force connections to close on SIGHUP from init */
void
-AutoResetServer (int sig)
+AutoResetServer(int sig)
{
int olderrno = errno;
@@ -404,9 +408,9 @@ GiveUp(int sig)
#if (defined WIN32 && defined __MINGW32__) || defined(__CYGWIN__)
CARD32
-GetTimeInMillis (void)
+GetTimeInMillis(void)
{
- return GetTickCount ();
+ return GetTickCount();
}
#else
CARD32
@@ -417,6 +421,7 @@ GetTimeInMillis(void)
#ifdef MONOTONIC_CLOCK
struct timespec tp;
static clockid_t clockid;
+
if (!clockid) {
#ifdef CLOCK_MONOTONIC_COARSE
if (clock_getres(CLOCK_MONOTONIC_COARSE, &tp) == 0 &&
@@ -435,41 +440,39 @@ GetTimeInMillis(void)
#endif
X_GETTIMEOFDAY(&tv);
- return(tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+ return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
}
#endif
void
-AdjustWaitForDelay (pointer waitTime, unsigned long newdelay)
+AdjustWaitForDelay(pointer waitTime, unsigned long newdelay)
{
- static struct timeval delay_val;
- struct timeval **wt = (struct timeval **) waitTime;
- unsigned long olddelay;
-
- if (*wt == NULL)
- {
- delay_val.tv_sec = newdelay / 1000;
- delay_val.tv_usec = 1000 * (newdelay % 1000);
- *wt = &delay_val;
+ static struct timeval delay_val;
+ struct timeval **wt = (struct timeval **) waitTime;
+ unsigned long olddelay;
+
+ if (*wt == NULL) {
+ delay_val.tv_sec = newdelay / 1000;
+ delay_val.tv_usec = 1000 * (newdelay % 1000);
+ *wt = &delay_val;
}
- else
- {
- olddelay = (*wt)->tv_sec * 1000 + (*wt)->tv_usec / 1000;
- if (newdelay < olddelay)
- {
- (*wt)->tv_sec = newdelay / 1000;
- (*wt)->tv_usec = 1000 * (newdelay % 1000);
- }
+ else {
+ olddelay = (*wt)->tv_sec * 1000 + (*wt)->tv_usec / 1000;
+ if (newdelay < olddelay) {
+ (*wt)->tv_sec = newdelay / 1000;
+ (*wt)->tv_usec = 1000 * (newdelay % 1000);
+ }
}
}
-void UseMsg(void)
+void
+UseMsg(void)
{
ErrorF("use: X [:<display>] [option]\n");
ErrorF("-a # default pointer acceleration (factor)\n");
ErrorF("-ac disable access control restrictions\n");
- ErrorF("-audit int set audit trail level\n");
- ErrorF("-auth file select authorization file\n");
+ ErrorF("-audit int set audit trail level\n");
+ ErrorF("-auth file select authorization file\n");
ErrorF("-br create root window with black background\n");
ErrorF("+bs enable any backing store support\n");
ErrorF("-bs disable any backing store support\n");
@@ -482,7 +485,8 @@ void UseMsg(void)
#ifdef DPMSExtension
ErrorF("-dpms disables VESA DPMS monitor control\n");
#endif
- ErrorF("-deferglyphs [none|all|16] defer loading of [no|all|16-bit] glyphs\n");
+ ErrorF
+ ("-deferglyphs [none|all|16] defer loading of [no|all|16-bit] glyphs\n");
ErrorF("-f # bell base (0-100)\n");
ErrorF("-fc string cursor font\n");
ErrorF("-fn string default font name\n");
@@ -526,7 +530,8 @@ void UseMsg(void)
ErrorF("+xinerama Enable XINERAMA extension\n");
ErrorF("-xinerama Disable XINERAMA extension\n");
#endif
- ErrorF("-dumbSched Disable smart scheduling, enable old behavior\n");
+ ErrorF
+ ("-dumbSched Disable smart scheduling, enable old behavior\n");
ErrorF("-schedInterval int Set scheduler interval in msec\n");
ErrorF("-sigstop Enable SIGSTOP based startup\n");
ErrorF("+extension name Enable extension\n");
@@ -545,14 +550,19 @@ void UseMsg(void)
* not contain a "/" and not start with a "-".
* --kvajk
*/
-static int
+static int
VerifyDisplayName(const char *d)
{
- if ( d == (char *)0 ) return 0; /* null */
- if ( *d == '\0' ) return 0; /* empty */
- if ( *d == '-' ) return 0; /* could be confused for an option */
- if ( *d == '.' ) return 0; /* must not equal "." or ".." */
- if ( strchr(d, '/') != (char *)0 ) return 0; /* very important!!! */
+ if (d == (char *) 0)
+ return 0; /* null */
+ if (*d == '\0')
+ return 0; /* empty */
+ if (*d == '-')
+ return 0; /* could be confused for an option */
+ if (*d == '.')
+ return 0; /* must not equal "." or ".." */
+ if (strchr(d, '/') != (char *) 0)
+ return 0; /* very important!!! */
return 1;
}
@@ -574,390 +584,339 @@ ProcessCommandLine(int argc, char *argv[])
PartialNetwork = TRUE;
#endif
- for ( i = 1; i < argc; i++ )
- {
- /* call ddx first, so it can peek/override if it wants */
- if((skip = ddxProcessArgument(argc, argv, i)))
- {
- i += (skip - 1);
- }
- else if(argv[i][0] == ':')
- {
- /* initialize display */
- display = argv[i];
- display++;
- if( ! VerifyDisplayName( display ) ) {
+ for (i = 1; i < argc; i++) {
+ /* call ddx first, so it can peek/override if it wants */
+ if ((skip = ddxProcessArgument(argc, argv, i))) {
+ i += (skip - 1);
+ }
+ else if (argv[i][0] == ':') {
+ /* initialize display */
+ display = argv[i];
+ display++;
+ if (!VerifyDisplayName(display)) {
ErrorF("Bad display name: %s\n", display);
UseMsg();
- FatalError("Bad display name, exiting: %s\n", display);
+ FatalError("Bad display name, exiting: %s\n", display);
}
- }
- else if ( strcmp( argv[i], "-a") == 0)
- {
- if(++i < argc)
- defaultPointerControl.num = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-ac") == 0)
- {
- defeatAccessControl = TRUE;
- }
- else if ( strcmp( argv[i], "-audit") == 0)
- {
- if(++i < argc)
- auditTrailLevel = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-auth") == 0)
- {
- if(++i < argc)
- InitAuthorization (argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-br") == 0) ; /* default */
- else if ( strcmp( argv[i], "+bs") == 0)
- enableBackingStore = TRUE;
- else if ( strcmp( argv[i], "-bs") == 0)
- disableBackingStore = TRUE;
- else if ( strcmp( argv[i], "c") == 0)
- {
- if(++i < argc)
- defaultKeyboardControl.click = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-c") == 0)
- {
- defaultKeyboardControl.click = 0;
- }
- else if ( strcmp( argv[i], "-cc") == 0)
- {
- if(++i < argc)
- defaultColorVisualClass = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-core") == 0)
- {
+ }
+ else if (strcmp(argv[i], "-a") == 0) {
+ if (++i < argc)
+ defaultPointerControl.num = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-ac") == 0) {
+ defeatAccessControl = TRUE;
+ }
+ else if (strcmp(argv[i], "-audit") == 0) {
+ if (++i < argc)
+ auditTrailLevel = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-auth") == 0) {
+ if (++i < argc)
+ InitAuthorization(argv[i]);
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-br") == 0); /* default */
+ else if (strcmp(argv[i], "+bs") == 0)
+ enableBackingStore = TRUE;
+ else if (strcmp(argv[i], "-bs") == 0)
+ disableBackingStore = TRUE;
+ else if (strcmp(argv[i], "c") == 0) {
+ if (++i < argc)
+ defaultKeyboardControl.click = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-c") == 0) {
+ defaultKeyboardControl.click = 0;
+ }
+ else if (strcmp(argv[i], "-cc") == 0) {
+ if (++i < argc)
+ defaultColorVisualClass = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-core") == 0) {
#if !defined(WIN32) || !defined(__MINGW32__)
- struct rlimit core_limit;
- getrlimit (RLIMIT_CORE, &core_limit);
- core_limit.rlim_cur = core_limit.rlim_max;
- setrlimit (RLIMIT_CORE, &core_limit);
-#endif
- CoreDump = TRUE;
- }
- else if ( strcmp( argv[i], "-nocursor") == 0)
- {
+ struct rlimit core_limit;
+
+ getrlimit(RLIMIT_CORE, &core_limit);
+ core_limit.rlim_cur = core_limit.rlim_max;
+ setrlimit(RLIMIT_CORE, &core_limit);
+#endif
+ CoreDump = TRUE;
+ }
+ else if (strcmp(argv[i], "-nocursor") == 0) {
EnableCursor = FALSE;
}
- else if ( strcmp( argv[i], "-dpi") == 0)
- {
- if(++i < argc)
- monitorResolution = atoi(argv[i]);
- else
- UseMsg();
- }
+ else if (strcmp(argv[i], "-dpi") == 0) {
+ if (++i < argc)
+ monitorResolution = atoi(argv[i]);
+ else
+ UseMsg();
+ }
#ifdef DPMSExtension
- else if ( strcmp( argv[i], "dpms") == 0)
- /* ignored for compatibility */ ;
- else if ( strcmp( argv[i], "-dpms") == 0)
- DPMSDisabledSwitch = TRUE;
-#endif
- else if ( strcmp( argv[i], "-deferglyphs") == 0)
- {
- if(++i >= argc || !ParseGlyphCachingMode(argv[i]))
- UseMsg();
- }
- else if ( strcmp( argv[i], "-f") == 0)
- {
- if(++i < argc)
- defaultKeyboardControl.bell = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-fc") == 0)
- {
- if(++i < argc)
- defaultCursorFont = argv[i];
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-fn") == 0)
- {
- if(++i < argc)
- defaultTextFont = argv[i];
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-fp") == 0)
- {
- if(++i < argc)
- {
- defaultFontPath = argv[i];
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-help") == 0)
- {
- UseMsg();
- exit(0);
- }
- else if ( (skip=XkbProcessArguments(argc,argv,i))!=0 ) {
- if (skip>0)
- i+= skip-1;
- else UseMsg();
- }
+ else if (strcmp(argv[i], "dpms") == 0)
+ /* ignored for compatibility */ ;
+ else if (strcmp(argv[i], "-dpms") == 0)
+ DPMSDisabledSwitch = TRUE;
+#endif
+ else if (strcmp(argv[i], "-deferglyphs") == 0) {
+ if (++i >= argc || !ParseGlyphCachingMode(argv[i]))
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-f") == 0) {
+ if (++i < argc)
+ defaultKeyboardControl.bell = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-fc") == 0) {
+ if (++i < argc)
+ defaultCursorFont = argv[i];
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-fn") == 0) {
+ if (++i < argc)
+ defaultTextFont = argv[i];
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-fp") == 0) {
+ if (++i < argc) {
+ defaultFontPath = argv[i];
+ }
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-help") == 0) {
+ UseMsg();
+ exit(0);
+ }
+ else if ((skip = XkbProcessArguments(argc, argv, i)) != 0) {
+ if (skip > 0)
+ i += skip - 1;
+ else
+ UseMsg();
+ }
#ifdef RLIMIT_DATA
- else if ( strcmp( argv[i], "-ld") == 0)
- {
- if(++i < argc)
- {
- limitDataSpace = atoi(argv[i]);
- if (limitDataSpace > 0)
- limitDataSpace *= 1024;
- }
- else
- UseMsg();
- }
+ else if (strcmp(argv[i], "-ld") == 0) {
+ if (++i < argc) {
+ limitDataSpace = atoi(argv[i]);
+ if (limitDataSpace > 0)
+ limitDataSpace *= 1024;
+ }
+ else
+ UseMsg();
+ }
#endif
#ifdef RLIMIT_NOFILE
- else if ( strcmp( argv[i], "-lf") == 0)
- {
- if(++i < argc)
- limitNoFile = atoi(argv[i]);
- else
- UseMsg();
- }
+ else if (strcmp(argv[i], "-lf") == 0) {
+ if (++i < argc)
+ limitNoFile = atoi(argv[i]);
+ else
+ UseMsg();
+ }
#endif
#ifdef RLIMIT_STACK
- else if ( strcmp( argv[i], "-ls") == 0)
- {
- if(++i < argc)
- {
- limitStackSpace = atoi(argv[i]);
- if (limitStackSpace > 0)
- limitStackSpace *= 1024;
- }
- else
- UseMsg();
- }
-#endif
- else if ( strcmp ( argv[i], "-nolock") == 0)
- {
+ else if (strcmp(argv[i], "-ls") == 0) {
+ if (++i < argc) {
+ limitStackSpace = atoi(argv[i]);
+ if (limitStackSpace > 0)
+ limitStackSpace *= 1024;
+ }
+ else
+ UseMsg();
+ }
+#endif
+ else if (strcmp(argv[i], "-nolock") == 0) {
#if !defined(WIN32) && !defined(__CYGWIN__)
- if (getuid() != 0)
- ErrorF("Warning: the -nolock option can only be used by root\n");
- else
-#endif
- nolock = TRUE;
- }
- else if ( strcmp( argv[i], "-nolisten") == 0)
- {
- if(++i < argc) {
- if (_XSERVTransNoListen(argv[i]))
- FatalError ("Failed to disable listen for %s transport",
- argv[i]);
- } else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-noreset") == 0)
- {
- dispatchExceptionAtReset = 0;
- }
- else if ( strcmp( argv[i], "-reset") == 0)
- {
- dispatchExceptionAtReset = DE_RESET;
- }
- else if ( strcmp( argv[i], "-p") == 0)
- {
- if(++i < argc)
- defaultScreenSaverInterval = ((CARD32)atoi(argv[i])) *
- MILLI_PER_MIN;
- else
- UseMsg();
- }
- else if (strcmp(argv[i], "-pogo") == 0)
- {
- dispatchException = DE_TERMINATE;
- }
- else if ( strcmp( argv[i], "-pn") == 0)
- PartialNetwork = TRUE;
- else if ( strcmp( argv[i], "-nopn") == 0)
- PartialNetwork = FALSE;
- else if ( strcmp( argv[i], "r") == 0)
- defaultKeyboardControl.autoRepeat = TRUE;
- else if ( strcmp( argv[i], "-r") == 0)
- defaultKeyboardControl.autoRepeat = FALSE;
- else if ( strcmp( argv[i], "-retro") == 0)
- party_like_its_1989 = TRUE;
- else if ( strcmp( argv[i], "-s") == 0)
- {
- if(++i < argc)
- defaultScreenSaverTime = ((CARD32)atoi(argv[i])) *
- MILLI_PER_MIN;
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-seat") == 0)
- {
- if(++i < argc)
- SeatId = argv[i];
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-t") == 0)
- {
- if(++i < argc)
- defaultPointerControl.threshold = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-terminate") == 0)
- {
- dispatchExceptionAtReset = DE_TERMINATE;
- }
- else if ( strcmp( argv[i], "-to") == 0)
- {
- if(++i < argc)
- TimeOutValue = ((CARD32)atoi(argv[i])) * MILLI_PER_SECOND;
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-tst") == 0)
- {
- noTestExtensions = TRUE;
- }
- else if ( strcmp( argv[i], "v") == 0)
- defaultScreenSaverBlanking = PreferBlanking;
- else if ( strcmp( argv[i], "-v") == 0)
- defaultScreenSaverBlanking = DontPreferBlanking;
- else if ( strcmp( argv[i], "-wm") == 0)
- defaultBackingStore = WhenMapped;
- else if ( strcmp( argv[i], "-wr") == 0)
+ if (getuid() != 0)
+ ErrorF
+ ("Warning: the -nolock option can only be used by root\n");
+ else
+#endif
+ nolock = TRUE;
+ }
+ else if (strcmp(argv[i], "-nolisten") == 0) {
+ if (++i < argc) {
+ if (_XSERVTransNoListen(argv[i]))
+ FatalError("Failed to disable listen for %s transport",
+ argv[i]);
+ }
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-noreset") == 0) {
+ dispatchExceptionAtReset = 0;
+ }
+ else if (strcmp(argv[i], "-reset") == 0) {
+ dispatchExceptionAtReset = DE_RESET;
+ }
+ else if (strcmp(argv[i], "-p") == 0) {
+ if (++i < argc)
+ defaultScreenSaverInterval = ((CARD32) atoi(argv[i])) *
+ MILLI_PER_MIN;
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-pogo") == 0) {
+ dispatchException = DE_TERMINATE;
+ }
+ else if (strcmp(argv[i], "-pn") == 0)
+ PartialNetwork = TRUE;
+ else if (strcmp(argv[i], "-nopn") == 0)
+ PartialNetwork = FALSE;
+ else if (strcmp(argv[i], "r") == 0)
+ defaultKeyboardControl.autoRepeat = TRUE;
+ else if (strcmp(argv[i], "-r") == 0)
+ defaultKeyboardControl.autoRepeat = FALSE;
+ else if (strcmp(argv[i], "-retro") == 0)
+ party_like_its_1989 = TRUE;
+ else if (strcmp(argv[i], "-s") == 0) {
+ if (++i < argc)
+ defaultScreenSaverTime = ((CARD32) atoi(argv[i])) *
+ MILLI_PER_MIN;
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-seat") == 0) {
+ if (++i < argc)
+ SeatId = argv[i];
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-t") == 0) {
+ if (++i < argc)
+ defaultPointerControl.threshold = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-terminate") == 0) {
+ dispatchExceptionAtReset = DE_TERMINATE;
+ }
+ else if (strcmp(argv[i], "-to") == 0) {
+ if (++i < argc)
+ TimeOutValue = ((CARD32) atoi(argv[i])) * MILLI_PER_SECOND;
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-tst") == 0) {
+ noTestExtensions = TRUE;
+ }
+ else if (strcmp(argv[i], "v") == 0)
+ defaultScreenSaverBlanking = PreferBlanking;
+ else if (strcmp(argv[i], "-v") == 0)
+ defaultScreenSaverBlanking = DontPreferBlanking;
+ else if (strcmp(argv[i], "-wm") == 0)
+ defaultBackingStore = WhenMapped;
+ else if (strcmp(argv[i], "-wr") == 0)
whiteRoot = TRUE;
- else if ( strcmp( argv[i], "-background") == 0) {
- if(++i < argc) {
- if (!strcmp ( argv[i], "none"))
+ else if (strcmp(argv[i], "-background") == 0) {
+ if (++i < argc) {
+ if (!strcmp(argv[i], "none"))
bgNoneRoot = TRUE;
else
UseMsg();
}
}
- else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
- if(++i < argc) {
- long reqSizeArg = atol(argv[i]);
-
- /* Request size > 128MB does not make much sense... */
- if( reqSizeArg > 0L && reqSizeArg < 128L ) {
- maxBigRequestSize = (reqSizeArg * 1048576L) - 1L;
- }
- else
- {
- UseMsg();
- }
- }
- else
- {
- UseMsg();
- }
- }
+ else if (strcmp(argv[i], "-maxbigreqsize") == 0) {
+ if (++i < argc) {
+ long reqSizeArg = atol(argv[i]);
+
+ /* Request size > 128MB does not make much sense... */
+ if (reqSizeArg > 0L && reqSizeArg < 128L) {
+ maxBigRequestSize = (reqSizeArg * 1048576L) - 1L;
+ }
+ else {
+ UseMsg();
+ }
+ }
+ else {
+ UseMsg();
+ }
+ }
#ifdef PANORAMIX
- else if ( strcmp( argv[i], "+xinerama") == 0){
- noPanoramiXExtension = FALSE;
- }
- else if ( strcmp( argv[i], "-xinerama") == 0){
- noPanoramiXExtension = TRUE;
- }
- else if ( strcmp( argv[i], "-disablexineramaextension") == 0){
- PanoramiXExtensionDisabledHack = TRUE;
- }
-#endif
- else if ( strcmp( argv[i], "-I") == 0)
- {
- /* ignore all remaining arguments */
- break;
- }
- else if (strncmp (argv[i], "tty", 3) == 0)
- {
+ else if (strcmp(argv[i], "+xinerama") == 0) {
+ noPanoramiXExtension = FALSE;
+ }
+ else if (strcmp(argv[i], "-xinerama") == 0) {
+ noPanoramiXExtension = TRUE;
+ }
+ else if (strcmp(argv[i], "-disablexineramaextension") == 0) {
+ PanoramiXExtensionDisabledHack = TRUE;
+ }
+#endif
+ else if (strcmp(argv[i], "-I") == 0) {
+ /* ignore all remaining arguments */
+ break;
+ }
+ else if (strncmp(argv[i], "tty", 3) == 0) {
/* init supplies us with this useless information */
- }
+ }
#ifdef XDMCP
- else if ((skip = XdmcpOptions(argc, argv, i)) != i)
- {
- i = skip - 1;
- }
-#endif
- else if ( strcmp( argv[i], "-dumbSched") == 0)
- {
- SmartScheduleDisable = TRUE;
- }
- else if ( strcmp( argv[i], "-schedInterval") == 0)
- {
- if (++i < argc)
- {
- SmartScheduleInterval = atoi(argv[i]);
- SmartScheduleSlice = SmartScheduleInterval;
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-schedMax") == 0)
- {
- if (++i < argc)
- {
- SmartScheduleMaxSlice = atoi(argv[i]);
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-render" ) == 0)
- {
- if (++i < argc)
- {
- int policy = PictureParseCmapPolicy (argv[i]);
-
- if (policy != PictureCmapPolicyInvalid)
- PictureCmapPolicy = policy;
- else
- UseMsg ();
- }
- else
- UseMsg ();
- }
- else if ( strcmp( argv[i], "-sigstop") == 0)
- {
- RunFromSigStopParent = TRUE;
- }
- else if ( strcmp( argv[i], "+extension") == 0)
- {
- if (++i < argc)
- {
- if (!EnableDisableExtension(argv[i], TRUE))
- EnableDisableExtensionError(argv[i], TRUE);
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-extension") == 0)
- {
- if (++i < argc)
- {
- if (!EnableDisableExtension(argv[i], FALSE))
- EnableDisableExtensionError(argv[i], FALSE);
- }
- else
- UseMsg();
- }
- else
- {
- ErrorF("Unrecognized option: %s\n", argv[i]);
- UseMsg();
- FatalError("Unrecognized option: %s\n", argv[i]);
+ else if ((skip = XdmcpOptions(argc, argv, i)) != i) {
+ i = skip - 1;
+ }
+#endif
+ else if (strcmp(argv[i], "-dumbSched") == 0) {
+ SmartScheduleDisable = TRUE;
+ }
+ else if (strcmp(argv[i], "-schedInterval") == 0) {
+ if (++i < argc) {
+ SmartScheduleInterval = atoi(argv[i]);
+ SmartScheduleSlice = SmartScheduleInterval;
+ }
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-schedMax") == 0) {
+ if (++i < argc) {
+ SmartScheduleMaxSlice = atoi(argv[i]);
+ }
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-render") == 0) {
+ if (++i < argc) {
+ int policy = PictureParseCmapPolicy(argv[i]);
+
+ if (policy != PictureCmapPolicyInvalid)
+ PictureCmapPolicy = policy;
+ else
+ UseMsg();
+ }
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-sigstop") == 0) {
+ RunFromSigStopParent = TRUE;
+ }
+ else if (strcmp(argv[i], "+extension") == 0) {
+ if (++i < argc) {
+ if (!EnableDisableExtension(argv[i], TRUE))
+ EnableDisableExtensionError(argv[i], TRUE);
+ }
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-extension") == 0) {
+ if (++i < argc) {
+ if (!EnableDisableExtension(argv[i], FALSE))
+ EnableDisableExtensionError(argv[i], FALSE);
+ }
+ else
+ UseMsg();
+ }
+ else {
+ ErrorF("Unrecognized option: %s\n", argv[i]);
+ UseMsg();
+ FatalError("Unrecognized option: %s\n", argv[i]);
}
}
}
@@ -972,61 +931,63 @@ set_font_authorizations(char **authorizations, int *authlen, pointer client)
static char *result = NULL;
static char *p = NULL;
- if (p == NULL)
- {
- char hname[1024], *hnameptr;
- unsigned int len;
+ if (p == NULL) {
+ char hname[1024], *hnameptr;
+ unsigned int len;
+
#if defined(IPv6) && defined(AF_INET6)
- struct addrinfo hints, *ai = NULL;
+ struct addrinfo hints, *ai = NULL;
#else
- struct hostent *host;
+ struct hostent *host;
+
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
+ _Xgethostbynameparams hparams;
#endif
#endif
- gethostname(hname, 1024);
+ gethostname(hname, 1024);
#if defined(IPv6) && defined(AF_INET6)
- memset(&hints, 0, sizeof(hints));
- hints.ai_flags = AI_CANONNAME;
- if (getaddrinfo(hname, NULL, &hints, &ai) == 0) {
- hnameptr = ai->ai_canonname;
- } else {
- hnameptr = hname;
- }
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_CANONNAME;
+ if (getaddrinfo(hname, NULL, &hints, &ai) == 0) {
+ hnameptr = ai->ai_canonname;
+ }
+ else {
+ hnameptr = hname;
+ }
#else
- host = _XGethostbyname(hname, hparams);
- if (host == NULL)
- hnameptr = hname;
- else
- hnameptr = host->h_name;
+ host = _XGethostbyname(hname, hparams);
+ if (host == NULL)
+ hnameptr = hname;
+ else
+ hnameptr = host->h_name;
#endif
- len = strlen(hnameptr) + 1;
- result = malloc(len + sizeof(AUTHORIZATION_NAME) + 4);
+ len = strlen(hnameptr) + 1;
+ result = malloc(len + sizeof(AUTHORIZATION_NAME) + 4);
- p = result;
+ p = result;
*p++ = sizeof(AUTHORIZATION_NAME) >> 8;
*p++ = sizeof(AUTHORIZATION_NAME) & 0xff;
*p++ = (len) >> 8;
*p++ = (len & 0xff);
- memmove(p, AUTHORIZATION_NAME, sizeof(AUTHORIZATION_NAME));
- p += sizeof(AUTHORIZATION_NAME);
- memmove(p, hnameptr, len);
- p += len;
+ memmove(p, AUTHORIZATION_NAME, sizeof(AUTHORIZATION_NAME));
+ p += sizeof(AUTHORIZATION_NAME);
+ memmove(p, hnameptr, len);
+ p += len;
#if defined(IPv6) && defined(AF_INET6)
- if (ai) {
- freeaddrinfo(ai);
- }
+ if (ai) {
+ freeaddrinfo(ai);
+ }
#endif
}
*authlen = p - result;
*authorizations = result;
return 1;
-#else /* TCPCONN */
+#else /* TCPCONN */
return 0;
-#endif /* TCPCONN */
+#endif /* TCPCONN */
}
void *
@@ -1039,9 +1000,9 @@ Xalloc(unsigned long amount)
*
* -- Mikhail Gusarov
*/
- if ((long)amount <= 0)
- ErrorF("Warning: Xalloc: "
- "requesting unpleasantly large amount of memory: %lu bytes.\n",
+ if ((long) amount <= 0)
+ ErrorF("Warning: Xalloc: "
+ "requesting unpleasantly large amount of memory: %lu bytes.\n",
amount);
return malloc(amount);
@@ -1051,6 +1012,7 @@ void *
XNFalloc(unsigned long amount)
{
void *ptr = malloc(amount);
+
if (!ptr)
FatalError("Out of memory");
return ptr;
@@ -1066,6 +1028,7 @@ void *
XNFcalloc(unsigned long amount)
{
void *ret = calloc(1, amount);
+
if (!ret)
FatalError("XNFcalloc: Out of memory");
return ret;
@@ -1081,9 +1044,9 @@ Xrealloc(void *ptr, unsigned long amount)
*
* -- Mikhail Gusarov
*/
- if ((long)amount <= 0)
- ErrorF("Warning: Xrealloc: "
- "requesting unpleasantly large amount of memory: %lu bytes.\n",
+ if ((long) amount <= 0)
+ ErrorF("Warning: Xrealloc: "
+ "requesting unpleasantly large amount of memory: %lu bytes.\n",
amount);
return realloc(ptr, amount);
@@ -1093,8 +1056,9 @@ void *
XNFrealloc(void *ptr, unsigned long amount)
{
void *ret = realloc(ptr, amount);
+
if (!ret)
- FatalError("XNFrealloc: Out of memory");
+ FatalError("XNFrealloc: Out of memory");
return ret;
}
@@ -1104,12 +1068,11 @@ Xfree(void *ptr)
free(ptr);
}
-
char *
Xstrdup(const char *s)
{
if (s == NULL)
- return NULL;
+ return NULL;
return strdup(s);
}
@@ -1119,107 +1082,104 @@ XNFstrdup(const char *s)
char *ret;
if (s == NULL)
- return NULL;
+ return NULL;
ret = strdup(s);
if (!ret)
- FatalError("XNFstrdup: Out of memory");
+ FatalError("XNFstrdup: Out of memory");
return ret;
}
void
-SmartScheduleStopTimer (void)
+SmartScheduleStopTimer(void)
{
- struct itimerval timer;
-
+ struct itimerval timer;
+
if (SmartScheduleDisable)
- return;
+ return;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 0;
- (void) setitimer (ITIMER_REAL, &timer, 0);
+ (void) setitimer(ITIMER_REAL, &timer, 0);
}
void
-SmartScheduleStartTimer (void)
+SmartScheduleStartTimer(void)
{
- struct itimerval timer;
-
+ struct itimerval timer;
+
if (SmartScheduleDisable)
- return;
+ return;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = SmartScheduleInterval * 1000;
- setitimer (ITIMER_REAL, &timer, 0);
+ setitimer(ITIMER_REAL, &timer, 0);
}
static void
-SmartScheduleTimer (int sig)
+SmartScheduleTimer(int sig)
{
SmartScheduleTime += SmartScheduleInterval;
}
void
-SmartScheduleInit (void)
+SmartScheduleInit(void)
{
- struct sigaction act;
+ struct sigaction act;
if (SmartScheduleDisable)
- return;
+ return;
memset((char *) &act, 0, sizeof(struct sigaction));
/* Set up the timer signal function */
act.sa_handler = SmartScheduleTimer;
- sigemptyset (&act.sa_mask);
- sigaddset (&act.sa_mask, SIGALRM);
- if (sigaction (SIGALRM, &act, 0) < 0)
- {
- perror ("sigaction for smart scheduler");
- SmartScheduleDisable = TRUE;
+ sigemptyset(&act.sa_mask);
+ sigaddset(&act.sa_mask, SIGALRM);
+ if (sigaction(SIGALRM, &act, 0) < 0) {
+ perror("sigaction for smart scheduler");
+ SmartScheduleDisable = TRUE;
}
}
#ifdef SIG_BLOCK
-static sigset_t PreviousSignalMask;
-static int BlockedSignalCount;
+static sigset_t PreviousSignalMask;
+static int BlockedSignalCount;
#endif
void
-OsBlockSignals (void)
+OsBlockSignals(void)
{
#ifdef SIG_BLOCK
- if (BlockedSignalCount++ == 0)
- {
- sigset_t set;
-
- sigemptyset (&set);
- sigaddset (&set, SIGALRM);
- sigaddset (&set, SIGVTALRM);
+ if (BlockedSignalCount++ == 0) {
+ sigset_t set;
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGALRM);
+ sigaddset(&set, SIGVTALRM);
#ifdef SIGWINCH
- sigaddset (&set, SIGWINCH);
+ sigaddset(&set, SIGWINCH);
#endif
#ifdef SIGIO
- sigaddset (&set, SIGIO);
+ sigaddset(&set, SIGIO);
#endif
- sigaddset (&set, SIGTSTP);
- sigaddset (&set, SIGTTIN);
- sigaddset (&set, SIGTTOU);
- sigaddset (&set, SIGCHLD);
- sigprocmask (SIG_BLOCK, &set, &PreviousSignalMask);
+ sigaddset(&set, SIGTSTP);
+ sigaddset(&set, SIGTTIN);
+ sigaddset(&set, SIGTTOU);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &set, &PreviousSignalMask);
}
#endif
}
void
-OsReleaseSignals (void)
+OsReleaseSignals(void)
{
#ifdef SIG_BLOCK
- if (--BlockedSignalCount == 0)
- {
- sigprocmask (SIG_SETMASK, &PreviousSignalMask, 0);
+ if (--BlockedSignalCount == 0) {
+ sigprocmask(SIG_SETMASK, &PreviousSignalMask, 0);
}
#endif
}
@@ -1230,7 +1190,7 @@ OsReleaseSignals (void)
*/
void
-OsAbort (void)
+OsAbort(void)
{
#ifndef __APPLE__
OsBlockSignals();
@@ -1253,39 +1213,39 @@ int
System(const char *command)
{
int pid, p;
- void (*csig)(int);
+ void (*csig) (int);
int status;
if (!command)
- return 1;
+ return 1;
csig = signal(SIGCHLD, SIG_DFL);
if (csig == SIG_ERR) {
- perror("signal");
- return -1;
+ perror("signal");
+ return -1;
}
DebugF("System: `%s'\n", command);
switch (pid = fork()) {
- case -1: /* error */
- p = -1;
- case 0: /* child */
- if (setgid(getgid()) == -1)
- _exit(127);
- if (setuid(getuid()) == -1)
- _exit(127);
- execl("/bin/sh", "sh", "-c", command, (char *)NULL);
- _exit(127);
- default: /* parent */
- do {
- p = waitpid(pid, &status, 0);
- } while (p == -1 && errno == EINTR);
-
+ case -1: /* error */
+ p = -1;
+ case 0: /* child */
+ if (setgid(getgid()) == -1)
+ _exit(127);
+ if (setuid(getuid()) == -1)
+ _exit(127);
+ execl("/bin/sh", "sh", "-c", command, (char *) NULL);
+ _exit(127);
+ default: /* parent */
+ do {
+ p = waitpid(pid, &status, 0);
+ } while (p == -1 && errno == EINTR);
+
}
if (signal(SIGCHLD, csig) == SIG_ERR) {
- perror("signal");
- return -1;
+ perror("signal");
+ return -1;
}
return p == -1 ? -1 : status;
@@ -1297,7 +1257,7 @@ static struct pid {
int pid;
} *pidlist;
-OsSigHandlerPtr old_alarm = NULL; /* XXX horrible awful hack */
+OsSigHandlerPtr old_alarm = NULL; /* XXX horrible awful hack */
pointer
Popen(const char *command, const char *type)
@@ -1307,71 +1267,73 @@ Popen(const char *command, const char *type)
int pdes[2], pid;
if (command == NULL || type == NULL)
- return NULL;
+ return NULL;
if ((*type != 'r' && *type != 'w') || type[1])
- return NULL;
+ return NULL;
if ((cur = malloc(sizeof(struct pid))) == NULL)
- return NULL;
+ return NULL;
if (pipe(pdes) < 0) {
- free(cur);
- return NULL;
+ free(cur);
+ return NULL;
}
/* Ignore the smart scheduler while this is going on */
old_alarm = OsSignal(SIGALRM, SIG_IGN);
if (old_alarm == SIG_ERR) {
- close(pdes[0]);
- close(pdes[1]);
- free(cur);
- perror("signal");
- return NULL;
+ close(pdes[0]);
+ close(pdes[1]);
+ free(cur);
+ perror("signal");
+ return NULL;
}
switch (pid = fork()) {
- case -1: /* error */
- close(pdes[0]);
- close(pdes[1]);
- free(cur);
- if (OsSignal(SIGALRM, old_alarm) == SIG_ERR)
- perror("signal");
- return NULL;
- case 0: /* child */
- if (setgid(getgid()) == -1)
- _exit(127);
- if (setuid(getuid()) == -1)
- _exit(127);
- if (*type == 'r') {
- if (pdes[1] != 1) {
- /* stdout */
- dup2(pdes[1], 1);
- close(pdes[1]);
- }
- close(pdes[0]);
- } else {
- if (pdes[0] != 0) {
- /* stdin */
- dup2(pdes[0], 0);
- close(pdes[0]);
- }
- close(pdes[1]);
- }
- execl("/bin/sh", "sh", "-c", command, (char *)NULL);
- _exit(127);
+ case -1: /* error */
+ close(pdes[0]);
+ close(pdes[1]);
+ free(cur);
+ if (OsSignal(SIGALRM, old_alarm) == SIG_ERR)
+ perror("signal");
+ return NULL;
+ case 0: /* child */
+ if (setgid(getgid()) == -1)
+ _exit(127);
+ if (setuid(getuid()) == -1)
+ _exit(127);
+ if (*type == 'r') {
+ if (pdes[1] != 1) {
+ /* stdout */
+ dup2(pdes[1], 1);
+ close(pdes[1]);
+ }
+ close(pdes[0]);
+ }
+ else {
+ if (pdes[0] != 0) {
+ /* stdin */
+ dup2(pdes[0], 0);
+ close(pdes[0]);
+ }
+ close(pdes[1]);
+ }
+ execl("/bin/sh", "sh", "-c", command, (char *) NULL);
+ _exit(127);
}
/* Avoid EINTR during stdio calls */
- OsBlockSignals ();
-
+ OsBlockSignals();
+
/* parent */
if (*type == 'r') {
- iop = fdopen(pdes[0], type);
- close(pdes[1]);
- } else {
- iop = fdopen(pdes[1], type);
- close(pdes[0]);
+ iop = fdopen(pdes[0], type);
+ close(pdes[1]);
+ }
+ else {
+ iop = fdopen(pdes[1], type);
+ close(pdes[0]);
}
cur->fp = iop;
@@ -1389,64 +1351,67 @@ pointer
Fopen(const char *file, const char *type)
{
FILE *iop;
+
#ifndef HAS_SAVED_IDS_AND_SETEUID
struct pid *cur;
int pdes[2], pid;
if (file == NULL || type == NULL)
- return NULL;
+ return NULL;
if ((*type != 'r' && *type != 'w') || type[1])
- return NULL;
+ return NULL;
if ((cur = malloc(sizeof(struct pid))) == NULL)
- return NULL;
+ return NULL;
if (pipe(pdes) < 0) {
- free(cur);
- return NULL;
+ free(cur);
+ return NULL;
}
switch (pid = fork()) {
- case -1: /* error */
- close(pdes[0]);
- close(pdes[1]);
- free(cur);
- return NULL;
- case 0: /* child */
- if (setgid(getgid()) == -1)
- _exit(127);
- if (setuid(getuid()) == -1)
- _exit(127);
- if (*type == 'r') {
- if (pdes[1] != 1) {
- /* stdout */
- dup2(pdes[1], 1);
- close(pdes[1]);
- }
- close(pdes[0]);
- } else {
- if (pdes[0] != 0) {
- /* stdin */
- dup2(pdes[0], 0);
- close(pdes[0]);
- }
- close(pdes[1]);
- }
- execl("/bin/cat", "cat", file, (char *)NULL);
- _exit(127);
+ case -1: /* error */
+ close(pdes[0]);
+ close(pdes[1]);
+ free(cur);
+ return NULL;
+ case 0: /* child */
+ if (setgid(getgid()) == -1)
+ _exit(127);
+ if (setuid(getuid()) == -1)
+ _exit(127);
+ if (*type == 'r') {
+ if (pdes[1] != 1) {
+ /* stdout */
+ dup2(pdes[1], 1);
+ close(pdes[1]);
+ }
+ close(pdes[0]);
+ }
+ else {
+ if (pdes[0] != 0) {
+ /* stdin */
+ dup2(pdes[0], 0);
+ close(pdes[0]);
+ }
+ close(pdes[1]);
+ }
+ execl("/bin/cat", "cat", file, (char *) NULL);
+ _exit(127);
}
/* Avoid EINTR during stdio calls */
- OsBlockSignals ();
-
+ OsBlockSignals();
+
/* parent */
if (*type == 'r') {
- iop = fdopen(pdes[0], type);
- close(pdes[1]);
- } else {
- iop = fdopen(pdes[1], type);
- close(pdes[0]);
+ iop = fdopen(pdes[0], type);
+ close(pdes[1]);
+ }
+ else {
+ iop = fdopen(pdes[1], type);
+ close(pdes[0]);
}
cur->fp = iop;
@@ -1462,18 +1427,18 @@ Fopen(const char *file, const char *type)
ruid = getuid();
euid = geteuid();
-
+
if (seteuid(ruid) == -1) {
- return NULL;
+ return NULL;
}
iop = fopen(file, type);
if (seteuid(euid) == -1) {
- fclose(iop);
- return NULL;
+ fclose(iop);
+ return NULL;
}
return iop;
-#endif /* HAS_SAVED_IDS_AND_SETEUID */
+#endif /* HAS_SAVED_IDS_AND_SETEUID */
}
int
@@ -1487,27 +1452,27 @@ Pclose(pointer iop)
fclose(iop);
for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
- if (cur->fp == iop)
- break;
+ if (cur->fp == iop)
+ break;
if (cur == NULL)
- return -1;
+ return -1;
do {
- pid = waitpid(cur->pid, &pstat, 0);
+ pid = waitpid(cur->pid, &pstat, 0);
} while (pid == -1 && errno == EINTR);
if (last == NULL)
- pidlist = cur->next;
+ pidlist = cur->next;
else
- last->next = cur->next;
+ last->next = cur->next;
free(cur);
/* allow EINTR again */
- OsReleaseSignals ();
-
+ OsReleaseSignals();
+
if (old_alarm && OsSignal(SIGALRM, old_alarm) == SIG_ERR) {
- perror("signal");
- return -1;
+ perror("signal");
+ return -1;
}
return pid == -1 ? -1 : pstat;
@@ -1523,8 +1488,7 @@ Fclose(pointer iop)
#endif
}
-#endif /* !WIN32 */
-
+#endif /* !WIN32 */
/*
* CheckUserParameters: check for long command line arguments and long
@@ -1553,7 +1517,6 @@ Fclose(pointer iop)
#define NO_OUTPUT_PIPES 0
#endif
-
/* Check args and env only if running setuid (euid == 0 && euid != uid) ? */
#ifndef CHECK_EUID
#ifndef WIN32
@@ -1573,7 +1536,7 @@ Fclose(pointer iop)
#define MAX_ARG_LENGTH 128
#define MAX_ENV_LENGTH 256
-#define MAX_ENV_PATH_LENGTH 2048 /* Limit for *PATH and TERMCAP */
+#define MAX_ENV_PATH_LENGTH 2048 /* Limit for *PATH and TERMCAP */
#if USE_ISPRINT
#include <ctype.h>
@@ -1611,115 +1574,116 @@ CheckUserParameters(int argc, char **argv, char **envp)
if (geteuid() == 0 && getuid() != geteuid())
#endif
{
- /* Check each argv[] */
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-fp") == 0)
- {
- i++; /* continue with next argument. skip the length check */
- if (i >= argc)
- break;
- } else
- {
- if (strlen(argv[i]) > MAX_ARG_LENGTH) {
- bad = ArgTooLong;
- break;
- }
- }
- a = argv[i];
- while (*a) {
- if (checkPrintable(*a) == 0) {
- bad = UnprintableArg;
- break;
- }
- a++;
- }
- if (bad)
- break;
- }
- if (!bad) {
- /* Check each envp[] */
- for (i = 0; envp[i]; i++) {
-
- /* Check for bad environment variables and values */
+ /* Check each argv[] */
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-fp") == 0) {
+ i++; /* continue with next argument. skip the length check */
+ if (i >= argc)
+ break;
+ }
+ else {
+ if (strlen(argv[i]) > MAX_ARG_LENGTH) {
+ bad = ArgTooLong;
+ break;
+ }
+ }
+ a = argv[i];
+ while (*a) {
+ if (checkPrintable(*a) == 0) {
+ bad = UnprintableArg;
+ break;
+ }
+ a++;
+ }
+ if (bad)
+ break;
+ }
+ if (!bad) {
+ /* Check each envp[] */
+ for (i = 0; envp[i]; i++) {
+
+ /* Check for bad environment variables and values */
#if REMOVE_ENV_LD
- while (envp[i] && (strncmp(envp[i], "LD", 2) == 0)) {
- for (j = i; envp[j]; j++) {
- envp[j] = envp[j+1];
- }
- }
-#endif
- if (envp[i] && (strlen(envp[i]) > MAX_ENV_LENGTH)) {
+ while (envp[i] && (strncmp(envp[i], "LD", 2) == 0)) {
+ for (j = i; envp[j]; j++) {
+ envp[j] = envp[j + 1];
+ }
+ }
+#endif
+ if (envp[i] && (strlen(envp[i]) > MAX_ENV_LENGTH)) {
#if REMOVE_LONG_ENV
- for (j = i; envp[j]; j++) {
- envp[j] = envp[j+1];
- }
- i--;
+ for (j = i; envp[j]; j++) {
+ envp[j] = envp[j + 1];
+ }
+ i--;
#else
- char *eq;
- int len;
-
- eq = strchr(envp[i], '=');
- if (!eq)
- continue;
- len = eq - envp[i];
- e = strndup(envp[i], len);
- if (!e) {
- bad = InternalError;
- break;
- }
- if (len >= 4 &&
- (strcmp(e + len - 4, "PATH") == 0 ||
- strcmp(e, "TERMCAP") == 0)) {
- if (strlen(envp[i]) > MAX_ENV_PATH_LENGTH) {
- bad = EnvTooLong;
- break;
- } else {
- free(e);
- }
- } else {
- bad = EnvTooLong;
- break;
- }
-#endif
- }
- }
- }
+ char *eq;
+ int len;
+
+ eq = strchr(envp[i], '=');
+ if (!eq)
+ continue;
+ len = eq - envp[i];
+ e = strndup(envp[i], len);
+ if (!e) {
+ bad = InternalError;
+ break;
+ }
+ if (len >= 4 &&
+ (strcmp(e + len - 4, "PATH") == 0 ||
+ strcmp(e, "TERMCAP") == 0)) {
+ if (strlen(envp[i]) > MAX_ENV_PATH_LENGTH) {
+ bad = EnvTooLong;
+ break;
+ }
+ else {
+ free(e);
+ }
+ }
+ else {
+ bad = EnvTooLong;
+ break;
+ }
+#endif
+ }
+ }
+ }
#if NO_OUTPUT_PIPES
- if (!bad) {
- struct stat buf;
+ if (!bad) {
+ struct stat buf;
- if (fstat(fileno(stdout), &buf) == 0 && S_ISFIFO(buf.st_mode))
- bad = OutputIsPipe;
- if (fstat(fileno(stderr), &buf) == 0 && S_ISFIFO(buf.st_mode))
- bad = OutputIsPipe;
- }
+ if (fstat(fileno(stdout), &buf) == 0 && S_ISFIFO(buf.st_mode))
+ bad = OutputIsPipe;
+ if (fstat(fileno(stderr), &buf) == 0 && S_ISFIFO(buf.st_mode))
+ bad = OutputIsPipe;
+ }
#endif
}
switch (bad) {
case NotBad:
- return;
+ return;
case UnsafeArg:
- ErrorF("Command line argument number %d is unsafe\n", i);
- break;
+ ErrorF("Command line argument number %d is unsafe\n", i);
+ break;
case ArgTooLong:
- ErrorF("Command line argument number %d is too long\n", i);
- break;
+ ErrorF("Command line argument number %d is too long\n", i);
+ break;
case UnprintableArg:
- ErrorF("Command line argument number %d contains unprintable"
- " characters\n", i);
- break;
+ ErrorF("Command line argument number %d contains unprintable"
+ " characters\n", i);
+ break;
case EnvTooLong:
- ErrorF("Environment variable `%s' is too long\n", e);
- break;
+ ErrorF("Environment variable `%s' is too long\n", e);
+ break;
case OutputIsPipe:
- ErrorF("Stdout and/or stderr is a pipe\n");
- break;
+ ErrorF("Stdout and/or stderr is a pipe\n");
+ break;
case InternalError:
- ErrorF("Internal Error\n");
- break;
+ ErrorF("Internal Error\n");
+ break;
default:
- ErrorF("Unknown error\n");
- break;
+ ErrorF("Unknown error\n");
+ break;
}
FatalError("X server aborted because of unsafe environment\n");
}
@@ -1734,15 +1698,15 @@ CheckUserParameters(int argc, char **argv, char **envp)
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <pwd.h>
-#endif /* USE_PAM */
+#endif /* USE_PAM */
void
CheckUserAuthorization(void)
{
#ifdef USE_PAM
static struct pam_conv conv = {
- misc_conv,
- NULL
+ misc_conv,
+ NULL
};
pam_handle_t *pamh = NULL;
@@ -1750,31 +1714,31 @@ CheckUserAuthorization(void)
int retval;
if (getuid() != geteuid()) {
- pw = getpwuid(getuid());
- if (pw == NULL)
- FatalError("getpwuid() failed for uid %d\n", getuid());
-
- retval = pam_start("xserver", pw->pw_name, &conv, &pamh);
- if (retval != PAM_SUCCESS)
- FatalError("pam_start() failed.\n"
- "\tMissing or mangled PAM config file or module?\n");
-
- retval = pam_authenticate(pamh, 0);
- if (retval != PAM_SUCCESS) {
- pam_end(pamh, retval);
- FatalError("PAM authentication failed, cannot start X server.\n"
- "\tPerhaps you do not have console ownership?\n");
- }
-
- retval = pam_acct_mgmt(pamh, 0);
- if (retval != PAM_SUCCESS) {
- pam_end(pamh, retval);
- FatalError("PAM authentication failed, cannot start X server.\n"
- "\tPerhaps you do not have console ownership?\n");
- }
-
- /* this is not a session, so do not do session management */
- pam_end(pamh, PAM_SUCCESS);
+ pw = getpwuid(getuid());
+ if (pw == NULL)
+ FatalError("getpwuid() failed for uid %d\n", getuid());
+
+ retval = pam_start("xserver", pw->pw_name, &conv, &pamh);
+ if (retval != PAM_SUCCESS)
+ FatalError("pam_start() failed.\n"
+ "\tMissing or mangled PAM config file or module?\n");
+
+ retval = pam_authenticate(pamh, 0);
+ if (retval != PAM_SUCCESS) {
+ pam_end(pamh, retval);
+ FatalError("PAM authentication failed, cannot start X server.\n"
+ "\tPerhaps you do not have console ownership?\n");
+ }
+
+ retval = pam_acct_mgmt(pamh, 0);
+ if (retval != PAM_SUCCESS) {
+ pam_end(pamh, retval);
+ FatalError("PAM authentication failed, cannot start X server.\n"
+ "\tPerhaps you do not have console ownership?\n");
+ }
+
+ /* this is not a session, so do not do session management */
+ pam_end(pamh, PAM_SUCCESS);
}
#endif
}
@@ -1783,7 +1747,7 @@ CheckUserAuthorization(void)
* Tokenize a string into a NULL terminated array of strings. Always returns
* an allocated array unless an error occurs.
*/
-char**
+char **
xstrtokenize(const char *str, const char *separators)
{
char **list, **nlist;
@@ -1811,7 +1775,7 @@ xstrtokenize(const char *str, const char *separators)
free(tmp);
return list;
-error:
+ error:
free(tmp);
for (n = 0; n < num; n++)
free(list[n]);