static int iterdpy (char *inputfilename, int lineno, int start, int argc, char *argv[], YesNoFunc yfunc, YesNoFunc nfunc, char *data) { int i; int status; int errors = 0; Xauth proto; AuthList *l, *next; /* * iterate */ for (i = start; i < argc; i++) { char *displayname = argv[i]; proto.address = proto.number = NULL; if (!get_displayname_auth (displayname, &proto)) { prefix (inputfilename, lineno); baddisplayname (displayname, argv[0]); errors++; continue; } status = 0; for (l = xauth_head; l; l = next) { next = l->next; if (match_auth_dpy (&proto, l->auth)) { if (yfunc) { status = (*yfunc) (inputfilename, lineno, l->auth, data); if (status < 0) break; } } else { if (nfunc) { status = (*nfunc) (inputfilename, lineno, l->auth, data); if (status < 0) break; } } } if (proto.address) free (proto.address); if (proto.number) free (proto.number); if (status < 0) { errors -= status; /* since status is negative */ break; } } return errors; }
/* * add displayname protocolname hexkey */ static int do_add(char *inputfilename, int lineno, int argc, char **argv) { int n, nnew, nrepl; int len; char *dpyname; char *protoname; char *hexkey; char *key; Xauth *auth; AuthList *list; if (argc != 4 || !argv[1] || !argv[2] || !argv[3]) { prefix (inputfilename, lineno); badcommandline (argv[0]); return 1; } dpyname = argv[1]; protoname = argv[2]; hexkey = argv[3]; len = strlen(hexkey); if (hexkey[0] == '"' && hexkey[len-1] == '"') { key = malloc(len-1); strncpy(key, hexkey+1, len-2); len -= 2; } else if (!strcmp(protoname, SECURERPC) || !strcmp(protoname, K5AUTH)) { key = malloc(len+1); strcpy(key, hexkey); } else { len = cvthexkey (hexkey, &key); if (len < 0) { prefix (inputfilename, lineno); fprintf (stderr, "key contains odd number of or non-hex characters\n"); return 1; } } auth = (Xauth *) malloc (sizeof (Xauth)); if (!auth) { prefix (inputfilename, lineno); fprintf (stderr, "unable to allocate %ld bytes for Xauth structure\n", (unsigned long)sizeof (Xauth)); free (key); return 1; } if (!get_displayname_auth (dpyname, auth)) { prefix (inputfilename, lineno); baddisplayname (dpyname, argv[0]); free (auth); free (key); return 1; } /* * allow an abbreviation for common protocol names */ if (strcmp (protoname, DEFAULT_PROTOCOL_ABBREV) == 0) { protoname = DEFAULT_PROTOCOL; } auth->name_length = strlen (protoname); auth->name = copystring (protoname, auth->name_length); if (!auth->name) { prefix (inputfilename, lineno); fprintf (stderr, "unable to allocate %d character protocol name\n", auth->name_length); free (auth); free (key); return 1; } auth->data_length = len; auth->data = key; list = (AuthList *) malloc (sizeof (AuthList)); if (!list) { prefix (inputfilename, lineno); fprintf (stderr, "unable to allocate %ld bytes for auth list\n", (unsigned long)sizeof (AuthList)); free (auth); free (key); free (auth->name); return 1; } list->next = NULL; list->auth = auth; /* * merge it in; note that merge will deal with allocation */ n = merge_entries (&xauth_head, list, &nnew, &nrepl); if (n <= 0) { prefix (inputfilename, lineno); fprintf (stderr, "unable to merge in added record\n"); return 1; } xauth_modified = True; return 0; }
static int iterdpy (const char *inputfilename, int lineno, int start, int argc, const char *argv[], YesNoFunc yfunc, YesNoFunc nfunc, char *data) { int i; int status; int errors = 0; Xauth *tmp_auth; AuthList *proto_head, *proto; AuthList *l, *next; /* * iterate */ for (i = start; i < argc; i++) { const char *displayname = argv[i]; if (!get_displayname_auth (displayname, &proto_head)) { prefix (inputfilename, lineno); baddisplayname (displayname, argv[0]); errors++; continue; } status = 0; for (l = xauth_head; l; l = next) { Bool matched = False; /* l may be freed by remove_entry below. so save its contents */ next = l->next; tmp_auth = copyAuth(l->auth); for (proto = proto_head; proto; proto = proto->next) { if (match_auth_dpy (proto->auth, tmp_auth)) { matched = True; if (yfunc) { status = (*yfunc) (inputfilename, lineno, tmp_auth, data); if (status < 0) break; } } } XauDisposeAuth(tmp_auth); if (matched == False) { if (nfunc) { status = (*nfunc) (inputfilename, lineno, l->auth, data); } } if (status < 0) break; } for (proto = proto_head; proto ; proto = next) { next = proto->next; if (proto->auth->address) free (proto->auth->address); if (proto->auth->number) free (proto->auth->number); free (proto->auth); free (proto); } if (status < 0) { errors -= status; /* since status is negative */ break; } } return errors; }