merge xinit 1.0.6

This commit is contained in:
matthieu 2007-09-15 17:12:01 +00:00
parent 7fd4ac2fb1
commit 59ec33559d
7 changed files with 260 additions and 105 deletions

View File

@ -64,6 +64,7 @@ MANDEFS = \
-D__miscmansuffix__=$(MISC_MAN_SUFFIX) \ -D__miscmansuffix__=$(MISC_MAN_SUFFIX) \
-D__XSERVERNAME__=Xorg -D__XCONFIGFILE__=xorg.conf \ -D__XSERVERNAME__=Xorg -D__XCONFIGFILE__=xorg.conf \
-D__xinitdir__=$(XINITDIR) \ -D__xinitdir__=$(XINITDIR) \
-D__bindir__=$(bindir) \
-DSHELL_CMD=$(SHELL_CMD) $(ARCHMANDEFS) -DSHELL_CMD=$(SHELL_CMD) $(ARCHMANDEFS)
SUFFIXES = .$(APP_MAN_SUFFIX) .man SUFFIXES = .$(APP_MAN_SUFFIX) .man
@ -100,5 +101,9 @@ xinitrc_DATA = xinitrc
CLEANFILES = xinitrc startx $(appman_DATA) CLEANFILES = xinitrc startx $(appman_DATA)
EXTRA_DIST = xinitrc.cpp startx.cpp $(appman_PRE) \ EXTRA_DIST = xinitrc.cpp startx.cpp $(appman_PRE) \
startx.cmd xinitrc.cmd xinit.def startx.cmd xinitrc.cmd xinit.def ChangeLog autogen.sh
ChangeLog:
(GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2)
dist-hook: ChangeLog

View File

@ -269,6 +269,7 @@ MANDEFS = \
-D__miscmansuffix__=$(MISC_MAN_SUFFIX) \ -D__miscmansuffix__=$(MISC_MAN_SUFFIX) \
-D__XSERVERNAME__=Xorg -D__XCONFIGFILE__=xorg.conf \ -D__XSERVERNAME__=Xorg -D__XCONFIGFILE__=xorg.conf \
-D__xinitdir__=$(XINITDIR) \ -D__xinitdir__=$(XINITDIR) \
-D__bindir__=$(bindir) \
-DSHELL_CMD=$(SHELL_CMD) $(ARCHMANDEFS) -DSHELL_CMD=$(SHELL_CMD) $(ARCHMANDEFS)
SUFFIXES = .$(APP_MAN_SUFFIX) .man SUFFIXES = .$(APP_MAN_SUFFIX) .man
@ -292,7 +293,7 @@ SCRIPTDEFS = \
xinitrc_DATA = xinitrc xinitrc_DATA = xinitrc
CLEANFILES = xinitrc startx $(appman_DATA) CLEANFILES = xinitrc startx $(appman_DATA)
EXTRA_DIST = xinitrc.cpp startx.cpp $(appman_PRE) \ EXTRA_DIST = xinitrc.cpp startx.cpp $(appman_PRE) \
startx.cmd xinitrc.cmd xinit.def startx.cmd xinitrc.cmd xinit.def ChangeLog autogen.sh
all: config.h all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-am $(MAKE) $(AM_MAKEFLAGS) all-am
@ -543,6 +544,9 @@ distdir: $(DISTFILES)
|| exit 1; \ || exit 1; \
fi; \ fi; \
done done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-hook
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
@ -727,8 +731,8 @@ uninstall-am: uninstall-appmanDATA uninstall-binPROGRAMS \
.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \ dist-gzip dist-hook dist-shar dist-tarZ dist-zip distcheck \
distclean-compile distclean-generic distclean-hdr \ distclean distclean-compile distclean-generic distclean-hdr \
distclean-tags distcleancheck distdir distuninstallcheck dvi \ distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \ dvi-am html html-am info info-am install install-am \
install-appmanDATA install-binPROGRAMS install-binSCRIPTS \ install-appmanDATA install-binPROGRAMS install-binSCRIPTS \
@ -750,6 +754,11 @@ xinitrc: xinitrc.cpp
startx: startx.cpp Makefile startx: startx.cpp Makefile
$(RAWCPP) $(SCRIPTDEFS) < $(srcdir)/startx.cpp | $(CPP_SED_MAGIC) > $@ $(RAWCPP) $(SCRIPTDEFS) < $(srcdir)/startx.cpp | $(CPP_SED_MAGIC) > $@
ChangeLog:
(GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2)
dist-hook: ChangeLog
# Tell versions [3.59,3.63) of GNU make to not export all variables. # Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded. # Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT: .NOEXPORT:

View File

@ -6,6 +6,9 @@
/* Define to 1 if you have the <inttypes.h> header file. */ /* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H #undef HAVE_INTTYPES_H
/* Define to 1 if you have the `killpg' function. */
#undef HAVE_KILLPG
/* Define to 1 if you have the <memory.h> header file. */ /* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H #undef HAVE_MEMORY_H

123
app/xinit/configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.59 for xinit 1.0.3. # Generated by GNU Autoconf 2.59 for xinit 1.0.6.
# #
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>. # Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
# #
@ -269,8 +269,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package. # Identity of this package.
PACKAGE_NAME='xinit' PACKAGE_NAME='xinit'
PACKAGE_TARNAME='xinit' PACKAGE_TARNAME='xinit'
PACKAGE_VERSION='1.0.3' PACKAGE_VERSION='1.0.6'
PACKAGE_STRING='xinit 1.0.3' PACKAGE_STRING='xinit 1.0.6'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg' PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
# Factoring default headers for most tests. # Factoring default headers for most tests.
@ -791,7 +791,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures xinit 1.0.3 to adapt to many kinds of systems. \`configure' configures xinit 1.0.6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -857,7 +857,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of xinit 1.0.3:";; short | recursive ) echo "Configuration of xinit 1.0.6:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -998,7 +998,7 @@ fi
test -n "$ac_init_help" && exit 0 test -n "$ac_init_help" && exit 0
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
xinit configure 1.0.3 xinit configure 1.0.6
generated by GNU Autoconf 2.59 generated by GNU Autoconf 2.59
Copyright (C) 2003 Free Software Foundation, Inc. Copyright (C) 2003 Free Software Foundation, Inc.
@ -1012,7 +1012,7 @@ cat >&5 <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by xinit $as_me 1.0.3, which was It was created by xinit $as_me 1.0.6, which was
generated by GNU Autoconf 2.59. Invocation command line was generated by GNU Autoconf 2.59. Invocation command line was
$ $0 $@ $ $0 $@
@ -1655,7 +1655,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='xinit' PACKAGE='xinit'
VERSION='1.0.3' VERSION='1.0.6'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -4296,6 +4296,109 @@ fi
for ac_func in killpg
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:$LINENO: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $ac_func innocuous_$ac_func
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
{
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
char (*f) () = $ac_func;
#endif
#ifdef __cplusplus
}
#endif
int
main ()
{
return f != $ac_func;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_var=no"
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
fi
done
# Build options # Build options
DEFAULT_XRDB=xrdb DEFAULT_XRDB=xrdb
@ -5213,7 +5316,7 @@ _ASBOX
} >&5 } >&5
cat >&5 <<_CSEOF cat >&5 <<_CSEOF
This file was extended by xinit $as_me 1.0.3, which was This file was extended by xinit $as_me 1.0.6, which was
generated by GNU Autoconf 2.59. Invocation command line was generated by GNU Autoconf 2.59. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -5276,7 +5379,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\ ac_cs_version="\\
xinit config.status 1.0.3 xinit config.status 1.0.6
configured by $0, generated by GNU Autoconf 2.59, configured by $0, generated by GNU Autoconf 2.59,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"

View File

@ -1,4 +1,3 @@
dnl Copyright 2005 Red Hat, Inc. dnl Copyright 2005 Red Hat, Inc.
dnl dnl
dnl Permission to use, copy, modify, distribute, and sell this software and its dnl Permission to use, copy, modify, distribute, and sell this software and its
@ -22,7 +21,7 @@ dnl
dnl Process this file with autoconf to create configure. dnl Process this file with autoconf to create configure.
AC_PREREQ([2.57]) AC_PREREQ([2.57])
AC_INIT(xinit,[1.0.3], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xinit) AC_INIT(xinit,[1.0.6], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xinit)
AM_INIT_AUTOMAKE([dist-bzip2]) AM_INIT_AUTOMAKE([dist-bzip2])
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
@ -37,6 +36,8 @@ AC_CANONICAL_HOST
AC_TYPE_SIGNAL AC_TYPE_SIGNAL
AC_FUNC_FORK AC_FUNC_FORK
AC_CHECK_FUNCS([killpg])
m4_ifdef([AS_HELP_STRING], , [m4_define([AS_HELP_STRING], m4_defn([AC_HELP_STRING]))]) m4_ifdef([AS_HELP_STRING], , [m4_define([AS_HELP_STRING], m4_defn([AC_HELP_STRING]))])
# Build options # Build options

View File

@ -170,7 +170,6 @@ fi
removelist= removelist=
#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE)
XCOMM set up default Xauth info for this machine XCOMM set up default Xauth info for this machine
case `uname` in case `uname` in
Linux*) Linux*)
@ -186,7 +185,15 @@ Linux*)
esac esac
authdisplay=${display:-:0} authdisplay=${display:-:0}
#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE)
mcookie=`MK_COOKIE` mcookie=`MK_COOKIE`
#else
mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"`
if test x"$mcookie" = x; then
echo "Couldn't create cookie"
exit 1
fi
#endif
dummy=0 dummy=0
XCOMM create a file with auth information for the server. ':0' is a dummy. XCOMM create a file with auth information for the server. ':0' is a dummy.
@ -216,8 +223,6 @@ EOF
fi fi
done done
#endif
#if defined(__SCO__) || defined(__UNIXWARE__) #if defined(__SCO__) || defined(__UNIXWARE__)
if [ "$REMOTE_SERVER" = "TRUE" ]; then if [ "$REMOTE_SERVER" = "TRUE" ]; then
exec SHELL_CMD ${client} exec SHELL_CMD ${client}

View File

@ -1,6 +1,6 @@
/* $Xorg: xinit.c,v 1.5 2001/02/09 02:05:49 xorgcvs Exp $ */ /* $Xorg: xinit.c,v 1.5 2001/02/09 02:05:49 xorgcvs Exp $ */
/* $XdotOrg: xc/programs/xinit/xinit.c,v 1.4 2005/10/04 01:27:34 ajax Exp $ */ /* $XdotOrg: xc/programs/xinit/xinit.c,v 1.4 2005/10/04 01:27:34 ajax Exp $ */
/* $OpenBSD: xinit.c,v 1.2 2006/11/26 17:17:57 matthieu Exp $ */ /* $OpenBSD: xinit.c,v 1.3 2007/09/15 17:12:01 matthieu Exp $ */
/* /*
@ -35,8 +35,10 @@ in this Software without prior written authorization from The Open Group.
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xos.h> #include <X11/Xos.h>
#include <X11/Xatom.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <stdint.h>
#include <sys/param.h> #include <sys/param.h>
#ifdef X_POSIX_C_SOURCE #ifdef X_POSIX_C_SOURCE
@ -79,25 +81,26 @@ char **envsave; /* to circumvent an UNIXOS2 problem */
#include <stdlib.h> #include <stdlib.h>
extern char **environ; extern char **environ;
char **newenviron = NULL; char **newenviron = NULL;
char **newenvironlast = NULL;
#ifndef SHELL #ifndef SHELL
#define SHELL "sh" #define SHELL "sh"
#endif #endif
#if !defined(HAS_VFORK) /* Imake */ && !defined(HAVE_WORKING_VFORK) /* autoconf*/ #ifndef HAVE_WORKING_VFORK
#ifndef vfork # ifndef vfork
#define vfork() fork() # define vfork() fork()
#endif # endif
#else #else
#if (defined(sun) && !defined(SVR4)) || defined(HAVE_VFORK_H) # ifdef HAVE_VFORK_H
#include <vfork.h> # include <vfork.h>
#endif # endif
#endif #endif
/* A/UX setpgid incorrectly removes the controlling terminal. /* A/UX setpgid incorrectly removes the controlling terminal.
Per Posix, only setsid should do that. */ Per Posix, only setsid should do that. */
#if !defined(X_NOT_POSIX) && !defined(macII) #ifdef macII
#define setpgrp setpgid #define setpgid setpgrp
#endif #endif
#ifdef __UNIXOS2__ #ifdef __UNIXOS2__
@ -110,12 +113,12 @@ char **newenviron = NULL;
#define Execvpe(path, argv, envp) execvp(path, argv) #define Execvpe(path, argv, envp) execvp(path, argv)
#endif #endif
char *bindir = BINDIR; const char *bindir = BINDIR;
char *server_names[] = { const char * const server_names[] = {
#if defined(ultrix) && defined(mips) #if defined(ultrix) && defined(mips)
"Xdec Digital color display on DECstation", "Xdec Digital color display on DECstation",
#endif #endif
#ifdef sun /* Sun */ #if defined(sun) && !defined(XORG) /* Sun */
"Xsun Sun BW2, CG2, CG3, CG4, or CG6 on Sun 2, 3, 4, or 386i", "Xsun Sun BW2, CG2, CG3, CG4, or CG6 on Sun 2, 3, 4, or 386i",
"Xsunmono Sun BW2 on Sun 2, 3, 4, or 386i ", "Xsunmono Sun BW2 on Sun 2, 3, 4, or 386i ",
"Xsun24 Sun BW2, CG2, CG3, CG4, CG6, or CG8 on Sun 4", "Xsun24 Sun BW2, CG2, CG3, CG4, CG6, or CG8 on Sun 4",
@ -133,14 +136,16 @@ char *server_names[] = {
"XFree86 XFree86 displays", "XFree86 XFree86 displays",
#endif #endif
#ifdef XORG #ifdef XORG
"Xorg X.Org displays", "Xorg Common X server for most displays",
#endif #endif
#ifdef __DARWIN__ #ifdef __DARWIN__
"XDarwin Darwin/Mac OS X IOKit displays", "XDarwin Darwin/Mac OS X IOKit displays",
"XDarwinQuartz Mac OS X Quartz displays", "XDarwinQuartz Mac OS X Quartz displays",
"XDarwinStartup Auto-select between XDarwin and XDarwinQuartz", "XDarwinStartup Auto-select between XDarwin and XDarwinQuartz",
#endif #endif
"Xvfb Virtual frame buffer",
"Xnest X server nested in a window on another X server",
"Xephyr kdrive-based nested X server",
NULL}; NULL};
#ifndef XINITRC #ifndef XINITRC
@ -180,9 +185,7 @@ union wait status;
#endif /* SYSV */ #endif /* SYSV */
int serverpid = -1; int serverpid = -1;
int clientpid = -1; int clientpid = -1;
#ifndef X_NOT_POSIX
volatile int gotSignal = 0; volatile int gotSignal = 0;
#endif
static void Execute ( char **vec, char **envp ); static void Execute ( char **vec, char **envp );
static Bool waitforserver ( void ); static Bool waitforserver ( void );
@ -197,43 +200,13 @@ static void Error ( char *fmt, ... );
#ifdef RETSIGTYPE /* autoconf AC_TYPE_SIGNAL */ #ifdef RETSIGTYPE /* autoconf AC_TYPE_SIGNAL */
# define SIGVAL RETSIGTYPE # define SIGVAL RETSIGTYPE
#else /* Imake */
#ifdef SIGNALRETURNSINT
#define SIGVAL int
#else
#define SIGVAL void
#endif
#endif /* RETSIGTYPE */ #endif /* RETSIGTYPE */
#ifdef X_NOT_POSIX
/* Can't use Error() in signal handlers */
#ifndef STDERR_FILENO
#define WRITES(s) write(STDERR_FILENO, (s), strlen(s))
#else
#define WRITES(s) write(fileno(stderr), (s), strlen(s))
#endif
#endif
static SIGVAL static SIGVAL
sigCatch(int sig) sigCatch(int sig)
{ {
#ifdef X_NOT_POSIX
char buf[1024];
signal(SIGTERM, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
snprintf(buf, sizeof buf, "%s: unexpected signal %d\r\n",
program, sig);
WRITES(buf);
shutdown();
_exit(ERR_EXIT);
#else
/* On system with POSIX signals, just interrupt the system call */ /* On system with POSIX signals, just interrupt the system call */
gotSignal = sig; gotSignal = sig;
#endif
} }
static SIGVAL static SIGVAL
@ -283,9 +256,7 @@ main(int argc, char *argv[], char *envp[])
int client_given = 0, server_given = 0; int client_given = 0, server_given = 0;
int client_args_given = 0, server_args_given = 0; int client_args_given = 0, server_args_given = 0;
int start_of_client_args, start_of_server_args; int start_of_client_args, start_of_server_args;
#ifndef X_NOT_POSIX
struct sigaction sa; struct sigaction sa;
#endif
#ifdef __UNIXOS2__ #ifdef __UNIXOS2__
envsave = envp; /* circumvent an EMX problem */ envsave = envp; /* circumvent an EMX problem */
@ -475,13 +446,7 @@ main(int argc, char *argv[], char *envp[])
#ifdef SIGCHLD #ifdef SIGCHLD
signal(SIGCHLD, SIG_DFL); /* Insurance */ signal(SIGCHLD, SIG_DFL); /* Insurance */
#endif #endif
#ifdef X_NOT_POSIX
signal(SIGTERM, sigCatch);
signal(SIGQUIT, sigCatch);
signal(SIGINT, sigCatch);
signal(SIGHUP, sigCatch);
signal(SIGPIPE, sigCatch);
#else
/* Let those signal interrupt the wait() call in the main loop */ /* Let those signal interrupt the wait() call in the main loop */
memset(&sa, 0, sizeof sa); memset(&sa, 0, sizeof sa);
sa.sa_handler = sigCatch; sa.sa_handler = sigCatch;
@ -493,16 +458,14 @@ main(int argc, char *argv[], char *envp[])
sigaction(SIGINT, &sa, NULL); sigaction(SIGINT, &sa, NULL);
sigaction(SIGHUP, &sa, NULL); sigaction(SIGHUP, &sa, NULL);
sigaction(SIGPIPE, &sa, NULL); sigaction(SIGPIPE, &sa, NULL);
#endif
signal(SIGALRM, sigAlarm); signal(SIGALRM, sigAlarm);
signal(SIGUSR1, sigUsr1); signal(SIGUSR1, sigUsr1);
if (startServer(server) > 0 if (startServer(server) > 0
&& startClient(client) > 0) { && startClient(client) > 0) {
pid = -1; pid = -1;
while (pid != clientpid && pid != serverpid while (pid != clientpid && pid != serverpid
#ifndef X_NOT_POSIX
&& gotSignal == 0 && gotSignal == 0
#endif
) )
pid = wait(NULL); pid = wait(NULL);
} }
@ -513,12 +476,12 @@ main(int argc, char *argv[], char *envp[])
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
shutdown(); shutdown();
#ifndef X_NOT_POSIX
if (gotSignal != 0) { if (gotSignal != 0) {
Error("unexpected signal %d.\n", gotSignal); Error("unexpected signal %d.\n", gotSignal);
exit(ERR_EXIT); exit(ERR_EXIT);
} }
#endif
if (serverpid < 0 ) if (serverpid < 0 )
Fatal("Server error.\n"); Fatal("Server error.\n");
if (clientpid < 0) if (clientpid < 0)
@ -596,32 +559,21 @@ processTimeout(int timeout, char *string)
static int static int
startServer(char *server[]) startServer(char *server[])
{ {
#if !defined(X_NOT_POSIX)
sigset_t mask, old; sigset_t mask, old;
#else
int old;
#endif
#ifdef __UNIXOS2__ #ifdef __UNIXOS2__
sigset_t pendings; sigset_t pendings;
#endif #endif
#if !defined(X_NOT_POSIX)
sigemptyset(&mask); sigemptyset(&mask);
sigaddset(&mask, SIGUSR1); sigaddset(&mask, SIGUSR1);
sigprocmask(SIG_BLOCK, &mask, &old); sigprocmask(SIG_BLOCK, &mask, &old);
#else
old = sigblock (sigmask (SIGUSR1));
#endif
serverpid = fork(); serverpid = fork();
switch(serverpid) { switch(serverpid) {
case 0: case 0:
/* Unblock */ /* Unblock */
#ifndef X_NOT_POSIX
sigprocmask(SIG_SETMASK, &old, NULL); sigprocmask(SIG_SETMASK, &old, NULL);
#else
sigsetmask (old);
#endif
/* /*
* don't hang on read/write to control tty * don't hang on read/write to control tty
@ -643,12 +595,12 @@ startServer(char *server[])
* if client is xterm -L * if client is xterm -L
*/ */
#ifndef __UNIXOS2__ #ifndef __UNIXOS2__
setpgrp(0,getpid()); setpgid(0,getpid());
#endif #endif
Execute (server, environ); Execute (server, environ);
Error ("no server \"%s\" in PATH\n", server[0]); Error ("no server \"%s\" in PATH\n", server[0]);
{ {
char **cpp; const char * const *cpp;
fprintf (stderr, fprintf (stderr,
"\nUse the -- option, or make sure that %s is in your path and\n", "\nUse the -- option, or make sure that %s is in your path and\n",
@ -691,7 +643,6 @@ startServer(char *server[])
*/ */
alarm (15); alarm (15);
#ifndef X_NOT_POSIX
#ifdef __UNIXOS2__ #ifdef __UNIXOS2__
/* /*
* fg2003/05/06: work around a problem in EMX: sigsuspend() * fg2003/05/06: work around a problem in EMX: sigsuspend()
@ -706,11 +657,6 @@ startServer(char *server[])
sigsuspend(&old); sigsuspend(&old);
alarm (0); alarm (0);
sigprocmask(SIG_SETMASK, &old, NULL); sigprocmask(SIG_SETMASK, &old, NULL);
#else
sigpause (old);
alarm (0);
sigsetmask (old);
#endif
if (waitforserver() == 0) { if (waitforserver() == 0) {
Error("unable to connect to X server\r\n"); Error("unable to connect to X server\r\n");
@ -723,15 +669,96 @@ startServer(char *server[])
return(serverpid); return(serverpid);
} }
static void
setWindowPath(void)
{
/* setting WINDOWPATH for clients */
Atom prop;
Atom actualtype;
int actualformat;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *buf;
const char *windowpath;
char *newwindowpath;
unsigned long num;
char nums[10];
int numn;
prop = XInternAtom(xd, "XFree86_VT", False);
if (prop == None) {
#ifdef DEBUG
fprintf(stderr, "no XFree86_VT atom\n");
#endif
return;
}
if (XGetWindowProperty(xd, DefaultRootWindow(xd), prop, 0, 1,
False, AnyPropertyType, &actualtype, &actualformat,
&nitems, &bytes_after, &buf)) {
#ifdef DEBUG
fprintf(stderr, "no XFree86_VT property\n");
#endif
return;
}
if (nitems != 1) {
#ifdef DEBUG
fprintf(stderr, "%lu items in XFree86_VT property!\n", nitems);
#endif
XFree(buf);
return;
}
switch (actualtype) {
case XA_CARDINAL:
case XA_INTEGER:
case XA_WINDOW:
switch (actualformat) {
case 8:
num = (*(uint8_t *)(void *)buf);
break;
case 16:
num = (*(uint16_t *)(void *)buf);
break;
case 32:
num = (*(uint32_t *)(void *)buf);
break;
default:
#ifdef DEBUG
fprintf(stderr, "format %d in XFree86_VT property!\n", actualformat);
#endif
XFree(buf);
return;
}
break;
default:
#ifdef DEBUG
fprintf(stderr, "type %lx in XFree86_VT property!\n", actualtype);
#endif
XFree(buf);
return;
}
XFree(buf);
windowpath = getenv("WINDOWPATH");
numn = snprintf(nums, sizeof(nums), "%lu", num);
if (!windowpath) {
newwindowpath = malloc(10 + 1 + numn + 1);
sprintf(newwindowpath, "WINDOWPATH=%s", nums);
} else {
newwindowpath = malloc(10 + 1 + strlen(windowpath) + 1 + numn + 1);
sprintf(newwindowpath, "WINDOWPATH=%s:%s", windowpath, nums);
}
*newenvironlast++ = newwindowpath;
*newenvironlast = NULL;
}
static int static int
startClient(char *client[]) startClient(char *client[])
{ {
setWindowPath();
if ((clientpid = vfork()) == 0) { if ((clientpid = vfork()) == 0) {
if (setuid(getuid()) == -1) { if (setuid(getuid()) == -1) {
Error("cannot change uid: %s\n", strerror(errno)); Error("cannot change uid: %s\n", strerror(errno));
_exit(ERR_EXIT); _exit(ERR_EXIT);
} }
setpgrp(0, getpid()); setpgid(0, getpid());
environ = newenviron; environ = newenviron;
#ifdef __UNIXOS2__ #ifdef __UNIXOS2__
#undef environ #undef environ
@ -750,7 +777,7 @@ startClient(char *client[])
return (clientpid); return (clientpid);
} }
#if !defined(X_NOT_POSIX) || defined(SYSV) || defined(__UNIXOS2__) #ifndef HAVE_KILLPG
#define killpg(pgrp, sig) kill(-(pgrp), sig) #define killpg(pgrp, sig) kill(-(pgrp), sig)
#endif #endif
@ -830,11 +857,11 @@ set_environment(void)
for (oldPtr = environ; *oldPtr; oldPtr++) ; for (oldPtr = environ; *oldPtr; oldPtr++) ;
nenvvars = (oldPtr - environ); nenvvars = (oldPtr - environ);
newenviron = (char **) malloc ((nenvvars + 2) * sizeof(char **)); newenviron = (char **) malloc ((nenvvars + 3) * sizeof(char **));
if (!newenviron) { if (!newenviron) {
fprintf (stderr, fprintf (stderr,
"%s: unable to allocate %d pointers for environment\n", "%s: unable to allocate %d pointers for environment\n",
program, nenvvars + 2); program, nenvvars + 3);
exit (1); exit (1);
} }
@ -846,11 +873,13 @@ set_environment(void)
/* copy pointers to other variables */ /* copy pointers to other variables */
for (oldPtr = environ; *oldPtr; oldPtr++) { for (oldPtr = environ; *oldPtr; oldPtr++) {
if (strncmp (*oldPtr, "DISPLAY=", 8) != 0) { if (strncmp (*oldPtr, "DISPLAY=", 8) != 0
&& strncmp (*oldPtr, "WINDOWPATH=", 11) != 0) {
*newPtr++ = *oldPtr; *newPtr++ = *oldPtr;
} }
} }
*newPtr = NULL; *newPtr = NULL;
newenvironlast=newPtr;
return; return;
} }