xauth.c revision 7a0395d0
17a0395d0Smrg/*
27a0395d0Smrg * $Xorg: xauth.c,v 1.4 2001/02/09 02:05:38 xorgcvs Exp $
37a0395d0Smrg * $XdotOrg: $
47a0395d0Smrg *
57a0395d0Smrg * xauth - manipulate authorization file
67a0395d0Smrg *
77a0395d0Smrg *
87a0395d0SmrgCopyright 1989,1998  The Open Group
97a0395d0Smrg
107a0395d0SmrgPermission to use, copy, modify, distribute, and sell this software and its
117a0395d0Smrgdocumentation for any purpose is hereby granted without fee, provided that
127a0395d0Smrgthe above copyright notice appear in all copies and that both that
137a0395d0Smrgcopyright notice and this permission notice appear in supporting
147a0395d0Smrgdocumentation.
157a0395d0Smrg
167a0395d0SmrgThe above copyright notice and this permission notice shall be included in
177a0395d0Smrgall copies or substantial portions of the Software.
187a0395d0Smrg
197a0395d0SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
207a0395d0SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
217a0395d0SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
227a0395d0SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
237a0395d0SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
247a0395d0SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257a0395d0Smrg
267a0395d0SmrgExcept as contained in this notice, the name of The Open Group shall not be
277a0395d0Smrgused in advertising or otherwise to promote the sale, use or other dealings
287a0395d0Smrgin this Software without prior written authorization from The Open Group.
297a0395d0Smrg * *
307a0395d0Smrg * Author:  Jim Fulton, MIT X Consortium
317a0395d0Smrg */
327a0395d0Smrg/* $XFree86: xc/programs/xauth/xauth.c,v 1.5tsi Exp $ */
337a0395d0Smrg
347a0395d0Smrg#ifdef HAVE_CONFIG_H
357a0395d0Smrg#include "config.h"
367a0395d0Smrg#endif
377a0395d0Smrg
387a0395d0Smrg#include "xauth.h"
397a0395d0Smrg
407a0395d0Smrg
417a0395d0Smrg/*
427a0395d0Smrg * global data
437a0395d0Smrg */
447a0395d0Smrgchar *ProgramName;			/* argv[0], set at top of main() */
457a0395d0Smrgint verbose = -1;			/* print certain messages */
467a0395d0SmrgBool ignore_locks = False;		/* for error recovery */
477a0395d0SmrgBool break_locks = False;		/* for error recovery */
487a0395d0SmrgBool no_name_lookups = False;		/* show addresses instead of names */
497a0395d0Smrg
507a0395d0Smrg/*
517a0395d0Smrg * local data
527a0395d0Smrg */
537a0395d0Smrg
547a0395d0Smrgstatic char *authfilename = NULL;	/* filename of cookie file */
557a0395d0Smrgstatic char *defcmds[] = { "source", "-", NULL };  /* default command */
567a0395d0Smrgstatic int ndefcmds = 2;
577a0395d0Smrgstatic char *defsource = "(stdin)";
587a0395d0Smrg
597a0395d0Smrg/*
607a0395d0Smrg * utility routines
617a0395d0Smrg */
627a0395d0Smrgstatic void
637a0395d0Smrgusage(void)
647a0395d0Smrg{
657a0395d0Smrg    static char *prefixmsg[] = {
667a0395d0Smrg"",
677a0395d0Smrg"where options include:",
687a0395d0Smrg"    -f authfilename                name of authority file to use",
697a0395d0Smrg"    -v                             turn on extra messages",
707a0395d0Smrg"    -q                             turn off extra messages",
717a0395d0Smrg"    -i                             ignore locks on authority file",
727a0395d0Smrg"    -b                             break locks on authority file",
737a0395d0Smrg"",
747a0395d0Smrg"and commands have the following syntax:",
757a0395d0Smrg"",
767a0395d0SmrgNULL };
777a0395d0Smrg    static char *suffixmsg[] = {
787a0395d0Smrg"A dash may be used with the \"merge\" and \"source\" to read from the",
797a0395d0Smrg"standard input.  Commands beginning with \"n\" use numeric format.",
807a0395d0Smrg"",
817a0395d0SmrgNULL };
827a0395d0Smrg    char **msg;
837a0395d0Smrg
847a0395d0Smrg    fprintf (stderr, "usage:  %s [-options ...] [command arg ...]\n",
857a0395d0Smrg	     ProgramName);
867a0395d0Smrg    for (msg = prefixmsg; *msg; msg++) {
877a0395d0Smrg	fprintf (stderr, "%s\n", *msg);
887a0395d0Smrg    }
897a0395d0Smrg    print_help (stderr, NULL, "    ");	/* match prefix indentation */
907a0395d0Smrg    fprintf (stderr, "\n");
917a0395d0Smrg    for (msg = suffixmsg; *msg; msg++) {
927a0395d0Smrg	fprintf (stderr, "%s\n", *msg);
937a0395d0Smrg    }
947a0395d0Smrg    exit (1);
957a0395d0Smrg}
967a0395d0Smrg
977a0395d0Smrg
987a0395d0Smrg/*
997a0395d0Smrg * The main routine - parses command line and calls action procedures
1007a0395d0Smrg */
1017a0395d0Smrgint
1027a0395d0Smrgmain(int argc, char *argv[])
1037a0395d0Smrg{
1047a0395d0Smrg    int i;
1057a0395d0Smrg    char *sourcename = defsource;
1067a0395d0Smrg    char **arglist = defcmds;
1077a0395d0Smrg    int nargs = ndefcmds;
1087a0395d0Smrg    int status;
1097a0395d0Smrg
1107a0395d0Smrg    ProgramName = argv[0];
1117a0395d0Smrg
1127a0395d0Smrg    for (i = 1; i < argc; i++) {
1137a0395d0Smrg	char *arg = argv[i];
1147a0395d0Smrg
1157a0395d0Smrg	if (arg[0] == '-') {
1167a0395d0Smrg	    char *flag;
1177a0395d0Smrg
1187a0395d0Smrg	    for (flag = (arg + 1); *flag; flag++) {
1197a0395d0Smrg		switch (*flag) {
1207a0395d0Smrg		  case 'f':		/* -f authfilename */
1217a0395d0Smrg		    if (++i >= argc) usage ();
1227a0395d0Smrg		    authfilename = argv[i];
1237a0395d0Smrg		    continue;
1247a0395d0Smrg		  case 'v':		/* -v */
1257a0395d0Smrg		    verbose = 1;
1267a0395d0Smrg		    continue;
1277a0395d0Smrg		  case 'q':		/* -q */
1287a0395d0Smrg		    verbose = 0;
1297a0395d0Smrg		    continue;
1307a0395d0Smrg		  case 'b':		/* -b */
1317a0395d0Smrg		    break_locks = True;
1327a0395d0Smrg		    continue;
1337a0395d0Smrg		  case 'i':		/* -i */
1347a0395d0Smrg		    ignore_locks = True;
1357a0395d0Smrg		    continue;
1367a0395d0Smrg		  case 'n':		/* -n */
1377a0395d0Smrg		    no_name_lookups = True;
1387a0395d0Smrg		    continue;
1397a0395d0Smrg		  default:
1407a0395d0Smrg		    usage ();
1417a0395d0Smrg		}
1427a0395d0Smrg	    }
1437a0395d0Smrg	} else {
1447a0395d0Smrg	    sourcename = "(argv)";
1457a0395d0Smrg	    nargs = argc - i;
1467a0395d0Smrg	    arglist = argv + i;
1477a0395d0Smrg	    if (verbose == -1) verbose = 0;
1487a0395d0Smrg	    break;
1497a0395d0Smrg	}
1507a0395d0Smrg    }
1517a0395d0Smrg
1527a0395d0Smrg    if (verbose == -1) {		/* set default, don't junk stdout */
1537a0395d0Smrg	verbose = (isatty(fileno(stdout)) != 0);
1547a0395d0Smrg    }
1557a0395d0Smrg
1567a0395d0Smrg    if (!authfilename) {
1577a0395d0Smrg	authfilename = XauFileName ();	/* static name, do not free */
1587a0395d0Smrg	if (!authfilename) {
1597a0395d0Smrg	    fprintf (stderr,
1607a0395d0Smrg		     "%s:  unable to generate an authority file name\n",
1617a0395d0Smrg		     ProgramName);
1627a0395d0Smrg	    exit (1);
1637a0395d0Smrg	}
1647a0395d0Smrg    }
1657a0395d0Smrg    if (auth_initialize (authfilename) != 0) {
1667a0395d0Smrg	/* error message printed in auth_initialize */
1677a0395d0Smrg	exit (1);
1687a0395d0Smrg    }
1697a0395d0Smrg
1707a0395d0Smrg    status = process_command (sourcename, 1, nargs, arglist);
1717a0395d0Smrg
1727a0395d0Smrg    (void) auth_finalize ();
1737a0395d0Smrg    exit ((status != 0) ? 1 : 0);
1747a0395d0Smrg}
1757a0395d0Smrg
1767a0395d0Smrg
177