Migrating away from using cpp for startx and xinitrc in xinit

Gaetan Nadon memsize at videotron.ca
Tue Feb 10 14:53:48 PST 2015


On 15-02-10 10:44 AM, Alan Coopersmith wrote:
> Right - build time uses such as startx & xinitrc should be replacable
> with a bit of work, such as Gaetan did in the past to use sed instead
> of cpp on a bunch of man pages.

I had worked on this three years ago. I tried removing the use of cpp as
a "text only" processor every where I could. I had a prototype of what
startx would look like. One has to watch for built-in compiler defines
auch as __APPLE__ and replaced them with Automake variables such as
$host_os assuming the semantic is the same. See attachment.

On a side note, the following lines should be removed as they are left
over  from ancient A/UX 3.0 support.

    #ifdef macII
    Xrepair
    screenrestore
    #endif



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20150210/f0156af6/attachment.html>
-------------- next part --------------
#!@SHELL_CMD@

#
# This is just a sample implementation of a slightly less primitive
# interface than xinit.  It looks for user .xinitrc and .xserverrc
# files, then system xinitrc and xserverrc files, else lets xinit choose
# its default.  The system xinitrc should probably do things like check
# for .Xresources files and merge them in, startup up a window manager,
# and pop a clock and serveral xterms.
#
# Site administrators are STRONGLY urged to write nicer versions.
#

unset DBUS_SESSION_BUS_ADDRESS
unset SESSION_MANAGER

prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
host_os=@host_os@

# Check for /usr/bin/X11 and BINDIR in the path, if not add them.
# This allows startx to be placed in a place like /usr/bin or /usr/local/bin
# and people may use X without changing their PATH.
# Note that we put our own bin directory at the front of the path, and
# the standard system path at the back, since if you are using the Xorg
# server theres a pretty good chance you want to bias the Xorg clients
# over the old system's clients.

case $host_os in
    *sco* | darwin*)
        # First our compiled path
        case $PATH in
        *:$bindir | *:$bindir:* | $bindir:*) ;;
        *) PATH=$bindir:$PATH ;;
        esac

        # Now the "old" compiled path
        case $host_os in
        darwin*)
            oldbindir=/usr/X11R6/bin
            ;;
        *)
            oldbindir=/usr/bin/X11
            ;;
        esac

        if [ -d "$oldbindir" ] ; then
            case $PATH in
                *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;;
                *) PATH=$PATH:$oldbindir ;;
            esac
        fi

        # Bourne shell does not automatically export modified environment variables
        # so export the new PATH just in case the user changes the shell
        export PATH
        ;;
esac

# Set up the XMERGE env var so that dos merge is happy under X
case $host_os in
    *sco*)
        if [ -f /usr/lib/merge/xmergeset.sh ]; then
            . /usr/lib/merge/xmergeset.sh
        elif [ -f /usr/lib/merge/console.disp ]; then
            XMERGE=`cat /usr/lib/merge/console.disp`
            export XMERGE
        fi

        userclientrc=$HOME/.startxrc
        sysclientrc=${libdir}/sys.startxrc
        scouserclientrc=$HOME/.xinitrc
        scosysclientrc=@XINITDIR@/xinitrc
        ;;
    *)
        userclientrc=$HOME/.xinitrc
        sysclientrc=@XINITDIR@/xinitrc
        ;;
esac

userserverrc=$HOME/.xserverrc
sysserverrc=@XINITDIR@/xserverrc
defaultclient=@XTERM@
defaultserver=@XSERVER@
defaultclientargs=""
defaultserverargs=""
defaultdisplay=":0"
clientargs=""
serverargs=""

case $host_os in
    darwin*)
        if [ "x$X11_PREFS_DOMAIN" = x ] ; then
            export X11_PREFS_DOMAIN=@launchdidprefix@".X11"
        fi

        # Initialize defaults (this will cut down on "safe" error messages)
        if ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then
            defaults write $X11_PREFS_DOMAIN cache_fonts -bool true
        fi

        if ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then
            defaults write $X11_PREFS_DOMAIN no_auth -bool false
        fi

        if ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then
            defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true
        fi

        # First, start caching fonts
        if [ x`defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then
            if [ -x $bindir/font_cache ] ; then
                $bindir/font_cache &
            elif [ -x $bindir/font_cache.sh ] ; then
                $bindir/font_cache.sh &
            elif [ -x $bindir/fc-cache ] ; then
                $bindir/fc-cache &
            fi
        fi

        if [ -x @XINITDIR@/privileged_startx ] ; then
        	# Don't push this into the background becasue it can cause
        	# a race to create /tmp/.X11-unix
        	@XINITDIR@/privileged_startx
        fi

        if [ x`defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then
            enable_xauth=1
        else
            enable_xauth=0
        fi

        if [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then
            defaultserverargs="$defaultserverargs -nolisten tcp"
        fi

        if defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then
            defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`"
        fi

        d=0
        while true ; do
            [ -e /tmp/.X$d-lock ] || break
            d=$(($d + 1))
        done
        defaultdisplay=":$d"
        unset d
        ;;
    *)
        enable_xauth=1
        ;;
esac

# SCO -t option: do not start an X server
case $host_os in
    *sco*)
        case $1 in
          -t)   if [ -n "$DISPLAY" ]; then
                        REMOTE_SERVER=TRUE
                        shift
                else
                        echo "DISPLAY environment variable not set"
                        exit 1
                fi
                ;;
        esac
        ;;
esac

whoseargs="client"
while [ x"$1" != x ]; do
    case "$1" in
    # '' required to prevent cpp from treating "/*" as a C comment.
    /''*|\./''*)
	if [ "$whoseargs" = "client" ]; then
	    if [ x"$client" = x ] && [ x"$clientargs" = x ]; then
		client="$1"
	    else
		clientargs="$clientargs $1"
	    fi
	else
	    if [ x"$server" = x ] && [ x"$serverargs" = x ]; then
		server="$1"
	    else
		serverargs="$serverargs $1"
	    fi
	fi
	;;
    --)
	whoseargs="server"
	;;
    *)
	if [ "$whoseargs" = "client" ]; then
	    clientargs="$clientargs $1"
	else
	    # display must be the FIRST server argument
	    if [ x"$serverargs" = x ] && @@
		 expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
		display="$1"
	    else
		serverargs="$serverargs $1"
	    fi
	fi
	;;
    esac
    shift
done

# process client arguments
if [ x"$client" = x ]; then
    client=$defaultclient

    # if no client arguments either, use rc file instead
    if [ x"$clientargs" = x ]; then
        if [ -f "$userclientrc" ]; then
            client=$userclientrc
        elif [ -f "$sysclientrc" ]; then
            client=$sysclientrc
        else
            case $host_os in
                *sco*)
                    if [ -f "$scouserclientrc" ]; then
                       client=$scouserclientrc
                    elif [ -f "$scosysclientrc" ]; then
                       client=$scosysclientrc
                    fi
                    ;;
            esac
        fi
        clientargs=$defaultclientargs
    fi
fi


# process server arguments
if [ x"$server" = x ]; then
    server=$defaultserver

    # if no server arguments or display either, use defaults
    if [ x"$serverargs" = x -a x"$display" = x ]; then
	# For compatibility reasons, only use xserverrc if there were no server command line arguments
	if [ -f "$userserverrc" ]; then
	    server=$userserverrc
	elif [ -f "$sysserverrc" ]; then
	    server=$sysserverrc
	fi

	serverargs=$defaultserverargs
	display=$defaultdisplay
    fi
fi

if [ x"$enable_xauth" = x1 ] ; then
    if [ x"$XAUTHORITY" = x ]; then
        XAUTHORITY=$HOME/.Xauthority
        export XAUTHORITY
    fi

    removelist=

    # set up default Xauth info for this machine
    case `uname` in
    Linux*)
        if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then
            hostname=`hostname -f`
        else
            hostname=`hostname`
        fi
        ;;
    *)
        hostname=`hostname`
        ;;
    esac

    authdisplay=${display:-:0}
    if test x"@MCOOKIE@" != x; then
        mcookie=`@MCOOKIE@`
    else
        if [ -r /dev/urandom ]; then
            mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"`
        else
            mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"`
        fi
    fi

    if test x"$mcookie" = x; then
        echo "Couldn't create cookie"
        exit 1
    fi
    dummy=0

    # create a file with auth information for the server. ':0' is a dummy.
    xserverauthfile=$HOME/.serverauth.$$
    trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM
    xauth -q -f "$xserverauthfile" << EOF
add :$dummy . $mcookie
EOF
    case $host_os in
        darwin* | cygwin*)
            xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g")
            serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'"
            ;;
        *)
            serverargs=${serverargs}" -auth "${xserverauthfile}
            ;;
    esac

    # now add the same credentials to the client authority file
    # if '$displayname' already exists do not overwrite it as another
    # server man need it. Add them to the '$xserverauthfile' instead.
    for displayname in $authdisplay $hostname$authdisplay; do
        authcookie=`@XAUTH@ list "$displayname" @@
        | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null;
        if [ "z${authcookie}" = "z" ] ; then
            @XAUTH@ -q << EOF 
add $displayname . $mcookie
EOF
        removelist="$displayname $removelist"
        else
            dummy=$(($dummy+1));
            @XAUTH@ -q -f "$xserverauthfile" << EOF
add :$dummy . $authcookie
EOF
        fi
    done
fi

case $host_os in
    *sco*)
        if [ "$REMOTE_SERVER" = "TRUE" ]; then
            exec @SHELL_CMD@ ${client}
        else
            @XINIT@ "$client" $clientargs -- "$server" $display $serverargs
        fi
        ;;
    darwin* | cygwin*)
        eval @XINIT@ \"$client\" $clientargs -- \"$server\" $display $serverargs
        ;;
    *)
        @XINIT@ "$client" $clientargs -- "$server" $display $serverargs
        ;;
esac

retval=$?

if [ x"$enable_xauth" = x1 ] ; then
    if [ x"$removelist" != x ]; then
        @XAUTH@ remove $removelist
    fi
    if [ x"$xserverauthfile" != x ]; then
        rm -f "$xserverauthfile"
    fi
fi

# various machines need special cleaning up
case $host_os in
    *linux*)
        if command -v deallocvt > /dev/null 2>&1; then
            deallocvt
        fi
        ;;
    *solaris*)
        kbd_mode -a
        ;;
esac

exit $retval


More information about the xorg-devel mailing list