Пример #1
0
/*
 * append --
 *	Append files to the archive - modifies original archive or creates
 *	a new archive if named archive does not exist.
 */
int
append(char **argv)
{
	struct stat sb;
	CF cf;
	FILE *afp;
	char *file;
	int eval, ntsz;

	afp = open_archive(O_CREAT|O_RDWR);
	if (fseeko(afp, 0, SEEK_END) == (off_t)-1)
		err(1, "lseek: %s", archive);

	/* Read from disk, write to an archive; pad on write. */
	SETCF(0, 0, afp, archive, 0);

	if (options & AR_C) {
		/* ain't no need for a.out but a small price to pay */
		if ((ntsz = mknametab(argv)) == 0)
			;

		/* build and write the symdef, also need a mid! */
		/* mkranlib(argv);
		if (mid & ELF) */ {
			options |= AR_S5;
			/* write out the nametab */
			if (ntsz)
				put_nametab(&cf);
		}
	}

	for (eval = 0; (file = *argv++);) {
		if (!(cf.rfp = fopen(file, "r"))) {
			warn("fopen: %s", file);
			eval = 1;
			continue;
		}
		if (options & AR_V)
			(void)printf("q - %s\n", file);
		cf.rname = file;
		put_arobj(&cf, &sb);
		(void)fclose(cf.rfp);
	}
	close_archive(afp);
	return (eval);
}
Пример #2
0
int
do_ranlib(void)
{
	CF cf;
	off_t size;
	FILE	*afp, *tfp;
	long	symcnt;			/* symbol count */
	long	tsymlen;		/* total string length */
	int	i, current_mid;

	current_mid = -1;
	afp = open_archive(O_RDWR);
	tfp = tmp();

	SETCF(afp, archive, tfp, tname, 0);

	/* Read through the archive, creating list of symbols. */
	symcnt = tsymlen = 0;
	ntsize = 0;
	r_fuzz = SARMAG;
	pnext = &rhead;
	while(get_arobj(afp)) {
		int new_mid;

		if (!strncmp(chdr.name, AR_NAMTAB, sizeof(AR_NAMTAB) - 1)) {
			size = ftello(afp);
			get_namtab(afp);
			ntsize = chdr.size + sizeof(struct ar_hdr);
			(void)fseeko(afp, size, SEEK_SET);
			r_fuzz += skip_arobj(afp);
			continue;
		}

		if (!strncmp(chdr.name, RANLIBMAG, sizeof(RANLIBMAG) - 1) ||
		    !strncmp(chdr.name, RANLIBMAG2, sizeof(RANLIBMAG2) - 1)) {
			r_fuzz += skip_arobj(afp);
			continue;
		}
		new_mid = read_exec(afp, tfp, &symcnt, &tsymlen);
		if (new_mid != -1) {
			if (current_mid == -1)
				current_mid = new_mid;
			else if (new_mid != current_mid)
				errx(1, "mixed object format archive: %x / %x",
					new_mid, current_mid);
		}
		put_arobj(&cf, NULL);
	}
	*pnext = NULL;

	SETCF(tfp, tname, afp, archive, NOPAD);

	/* Create the symbol table.  Endianess the same as last mid seen */
	symobj(afp, current_mid, symcnt, tsymlen);
	put_nametab(&cf);

	/* Copy the saved objects into the archive. */
	size = ftello(tfp);
	rewind(tfp);
	copy_ar(&cf, size);
	fflush(afp);
	(void)ftruncate(fileno(afp), ftello(afp));
	(void)fclose(tfp);

	/* Set the time. */
	settime(afp);
	close_archive(afp);
	return(0);
}