#! /bin/sh # xinit-auth --- start X with authorization cookies # Copyright (C) 1995 Noah S. Friedman # Author: Noah Friedman # Created: 1995-07-10 # $Id: xinit-auth,v 1.3 1996/06/26 17:27:08 friedman Exp $ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, you can either send email to this # program's maintainer or write to: The Free Software Foundation, # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. # Commentary: # Code: # Name by which this script was invoked. progname=`echo "$0" | sed -e 's/[^\/]*\///g'` # To prevent hairy quoting and escaping later. bq='`' eq="'" usage="Usage: $progname {options} Options are: -D, --debug Turn on shell debugging ($bq${bq}set -x$eq$eq). -h, --help You're looking at it. -l, --long-option ARG Example option that takes gratuitous argument. -v, --verbose Be verbose. " # Initialize variables. # Don't use `unset' since old bourne shells don't have this command. # Instead, assign them an empty value. debug= verbose= # Clever way to save arguments whilst preserving quoting. # Note that only one set of args can be saved at a time. # Usage: eval "$save_current_args" # eval "$restore_saved_args" save_current_args=' { _saved_args= while : ; do case $# in 0 ) break ;; esac eval _saved_args$#=\$1 _saved_args="$_saved_args \"\$_saved_args$#\"" shift done eval "$restore_saved_args" }' restore_saved_args=' { eval '\''{ eval set fnord $_saved_args ; }'\'' shift }' # Usage: eval "$getopt"; value=$optarg # or optarg_optional=t; eval "$getopt"; value=$optarg # # This function automatically shifts the positional args as appropriate. # The argument to an option is optional if the variable `optarg_optional' # is non-empty. Otherwise, the argument is required and getopt will cause # the program to exit on an error. optarg_optional is reset to be empty # after every call to getopt. The argument (if any) is stored in the # variable `optarg'. # # Long option syntax is `--foo=bar' or `--foo bar'. 2nd argument # won't get used if first long option syntax was used. # # Note: because of broken bourne shells, using --foo=bar syntax can # actually screw the quoting of args that end with trailing newlines. # Specifically, most shells strip trailing newlines from substituted # output, regardless of quoting. getopt=' { optarg= case "$1" in --*=* ) optarg=`echo "$1" | sed -e "1s/^[^=]*=//"` shift ;; * ) case ${2+set} in set ) optarg="$2" shift shift ;; * ) case "$optarg_optional" in "" ) case "$1" in --*=* ) option=`echo "$1" | sed -e "1s/=.*//;q"` ;; * ) option="$1" ;; esac exec 1>&2 echo "$progname: option $bq$option$eq requires argument." echo "$progname: use $bq--help$eq to list option syntax." exit 1 ;; esac ;; esac ;; esac optarg_optional= }' # Parse command line arguments. # Make sure that all wildcarded options are long enough to be unambiguous. # It's a good idea to document the full long option name in each case. # Long options which take arguments will need a `*' appended to the # canonical name to match the value appended after the `=' character. while : ; do case $# in 0) break ;; esac case "$1" in -D | --debug | --d* ) debug=t shift ;; -h | --help | --h ) echo "$usage" 1>&2 exit 0 ;; # Provided as an example of how to process options with arguments -l | --long-option* | --l* ) eval "$getopt" option_arg=$optarg ;; -v | --verbose | --v* ) verbose=t shift ;; -- ) # Stop option processing shift break ;; -* ) case "$1" in --*=* ) arg=`echo "$1" | sed -e 's/=.*//'` ;; * ) arg="$1" ;; esac exec 1>&2 echo "$progname: unknown or ambiguous option $bq$arg$eq" echo "$progname: Use $bq--help$eq for a list of options." exit 1 ;; * ) break ;; esac done case "$debug" in t ) set -x ;; esac # Find out if any server options were already specified on the command # line. If not, add -- before the -auth option. server_option_separator='--' for f in ${1+"$@"} ; do case "$f" in -- ) server_option_separator= break ;; esac done XAUTHORITY=${XAUTHORITY-$HOME/.Xauthority} set fnord ${1+"$@"} $server_option_separator -auth $XAUTHORITY case "$server_options_p" in t ) : ;; * ) set fnord ${1+"$@"} # TODO: finish this ;; esac randomkey=`perl -e ' for (1..10) { srand(time+$$+$seed); printf ("%4.4lx", ($seed = int (rand (65536)))); } print "\n"; '` HOSTNAME=${HOSTNAME-`hostname`} xauth add ${HOSTNAME}/unix:0 . "$randomkey" xauth add ${HOSTNAME}:0 . "$randomkey" exec xinit ${1+"$@"} # xinit-auth ends here