/* * merge filename [filename ...] */ static int do_merge(char *inputfilename, int lineno, int argc, char **argv) { int i; int errors = 0; AuthList *head, *tail, *listhead, *listtail; int nentries, nnew, nrepl; Bool numeric = False; if (argc < 2) { prefix (inputfilename, lineno); badcommandline (argv[0]); return 1; } if (argv[0][0] == 'n') numeric = True; listhead = listtail = NULL; for (i = 1; i < argc; i++) { char *filename = argv[i]; FILE *fp; Bool used_stdin = False; fp = open_file (&filename, numeric ? "r" : "rb", &used_stdin, inputfilename, lineno, argv[0]); if (!fp) { errors++; continue; } head = tail = NULL; nentries = read_auth_entries (fp, numeric, &head, &tail); if (nentries == 0) { prefix (inputfilename, lineno); fprintf (stderr, "unable to read any entries from file \"%s\"\n", filename); errors++; } else { /* link it in */ add_to_list (listhead, listtail, head); } if (!used_stdin) (void) fclose (fp); } /* * if we have new entries, merge them in (freeing any duplicates) */ if (listhead) { nentries = merge_entries (&xauth_head, listhead, &nnew, &nrepl); if (verbose) printf ("%d entries read in: %d new, %d replacement%s\n", nentries, nnew, nrepl, nrepl != 1 ? "s" : ""); if (nentries > 0) xauth_modified = True; } return 0; }
Tt_status _Tt_auth:: read_auth_file(char *filename) { static const char *funcname = "Tt_auth::read_auth_file()"; FILE *authfp; Tt_status status = TT_OK; if (0 == (authfp = fopen (filename, "rb"))) { _tt_syslog(0, LOG_ERR, "%s: unable to read auth entries from file \"%s\"\n", funcname, filename); return TT_AUTHFILE_ACCESS; } status = read_auth_entries(authfp, &_entries_head); if (TT_OK != status) _tt_syslog(0, LOG_ERR, "%s: unable to read auth entries from file \"%s\"\n", funcname, filename); (void) fclose (authfp); return status; }
int auth_initialize(char *authfilename) { int n; AuthList *head, *tail; FILE *authfp; Bool exists; xauth_filename = authfilename; /* used in cleanup, prevent race with signals */ register_signals (); bzero ((char *) hexvalues, sizeof hexvalues); hexvalues['0'] = 0; hexvalues['1'] = 1; hexvalues['2'] = 2; hexvalues['3'] = 3; hexvalues['4'] = 4; hexvalues['5'] = 5; hexvalues['6'] = 6; hexvalues['7'] = 7; hexvalues['8'] = 8; hexvalues['9'] = 9; hexvalues['a'] = hexvalues['A'] = 0xa; hexvalues['b'] = hexvalues['B'] = 0xb; hexvalues['c'] = hexvalues['C'] = 0xc; hexvalues['d'] = hexvalues['D'] = 0xd; hexvalues['e'] = hexvalues['E'] = 0xe; hexvalues['f'] = hexvalues['F'] = 0xf; if (break_locks && verbose) { printf ("Attempting to break locks on authority file %s\n", authfilename); } if (ignore_locks) { if (break_locks) XauUnlockAuth (authfilename); } else { n = XauLockAuth (authfilename, XAUTH_DEFAULT_RETRIES, XAUTH_DEFAULT_TIMEOUT, (break_locks ? 0L : XAUTH_DEFAULT_DEADTIME)); if (n != LOCK_SUCCESS) { char *reason = "unknown error"; switch (n) { case LOCK_ERROR: reason = "error"; break; case LOCK_TIMEOUT: reason = "timeout"; break; } fprintf (stderr, "%s: %s in locking authority file %s\n", ProgramName, reason, authfilename); return -1; } else xauth_locked = True; } /* these checks can only be done reliably after the file is locked */ exists = (access (authfilename, F_OK) == 0); if (exists && access (authfilename, W_OK) != 0) { fprintf (stderr, "%s: %s not writable, changes will be ignored\n", ProgramName, authfilename); xauth_allowed = False; } original_umask = umask (0077); /* disallow non-owner access */ authfp = fopen (authfilename, "rb"); if (!authfp) { int olderrno = errno; /* if file there then error */ if (access (authfilename, F_OK) == 0) { /* then file does exist! */ errno = olderrno; return -1; } /* else ignore it */ fprintf (stderr, "%s: creating new authority file %s\n", ProgramName, authfilename); } else { xauth_existed = True; n = read_auth_entries (authfp, False, &head, &tail); (void) fclose (authfp); if (n < 0) { fprintf (stderr, "%s: unable to read auth entries from file \"%s\"\n", ProgramName, authfilename); return -1; } xauth_head = head; } n = strlen (authfilename); xauth_filename = malloc (n + 1); if (xauth_filename) strcpy (xauth_filename, authfilename); else { fprintf(stderr,"cannot allocate memory\n"); return -1; } xauth_modified = False; if (verbose) { printf ("%s authority file %s\n", ignore_locks ? "Ignoring locks on" : "Using", authfilename); } return 0; }