/* * 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; }
int write_tar_entries (char* tarname, char* manifest) { char line[10000]; char unused[50]; char tentry[50]; char part[50]; char file[50]; char* entries[100]; int i = 0; FILE* f; f = fopen(manifest, "r"); while (fgets(line, sizeof(line), f)) { split(line, "\n", tentry, unused); split(tentry, ":", part, file); p_write_tar_entry(part, file, get_file_size(file), get_file_modified(file), 0); write_checksum(part, 0); strcpy(entries[i], part); i++; } fclose(f); merge_entries(tarname, entries, i); finalize_tar(tarname); return 0; }
static void trivially_merge_cache(struct cache_entry **src, int nr) { static struct cache_entry null_entry; struct cache_entry **dst = src; struct cache_entry *old = &null_entry; while (nr) { struct cache_entry *ce, *result; ce = src[0]; /* We throw away original cache entries except for the stat information */ if (!ce_stage(ce)) { old = ce; src++; nr--; active_nr--; continue; } if (nr > 2 && (result = merge_entries(ce, src[1], src[2])) != NULL) { /* * See if we can re-use the old CE directly? * That way we get the uptodate stat info. */ if (path_matches(result, old) && same(result, old)) *result = *old; ce = result; ce->ce_flags &= ~htons(CE_STAGEMASK); src += 2; nr -= 2; active_nr -= 2; } *dst++ = ce; src++; nr--; } }
/* * 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; }