This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libbfd problem


Hi,

I solved with this small snippet, thank you, anyway.

Best Regards,
Laszlo Papp

#include <stdio.h>
#include <string.h>
#include <ctype.h>

const char *AR_MAGIC = "!<arch>\n";
const char *CONTROL_FILE_DEBIAN = "control.tar.gz";
const char *DATA_FILE_DEBIAN = "data.tar.gz";
const char *DEBIAN_BINARY = "debian-binary";

#define MIN(a, b) ((a) < (b) ? (a) : (b))

struct ar_hdr
{
	char name[16];
	char mod[12];
	char uid[6];
	char gid[6];
	char mode[8];
	char size[10];
	char magic[2];
};

int extract_file(FILE *ar, const char *name)
{
	char buffer[1024];
	struct ar_hdr file_hdr;
	FILE *fpout = 0;
	fseek(ar, 0, SEEK_SET);

	fread(buffer, 1, strlen(AR_MAGIC), ar);
	if (strncmp(buffer, AR_MAGIC, strlen(AR_MAGIC)))
		return -1;

	for (fread(&file_hdr, sizeof(file_hdr), 1, ar);
	     !feof(ar);
	     fread(&file_hdr, sizeof(file_hdr), 1, ar))
	{
		char *spc;
		size_t fsize = 0;
		int i;

		for (i = 0; i < 10 && isdigit(file_hdr.size[i]); ++i)
			fsize = fsize * 10 + file_hdr.size[i] - '0';

		memcpy(buffer, file_hdr.name, sizeof(file_hdr.name));
		buffer[sizeof(file_hdr.name)] = '\0';

		// GNU ar
		if ((spc = strchr(buffer, '/')))
			*spc = '\0';
		// Common ar
		else if ((spc = strchr(buffer, ' ')))
 			*spc = '\0';

		if (strcmp(buffer, name)) {
			fseek(ar, fsize + (fsize&1), SEEK_CUR);
			continue;
		} else {
			size_t byte_read = 0;
			fpout = fopen(name, "w");
			if (fpout) {
				while (byte_read < fsize + (fsize&1)) {
					if (feof(ar))
						return -1;

					size_t r = fread(buffer, 1, MIN(sizeof(buffer), fsize + (fsize&1)
- byte_read), ar);
					fwrite(buffer, 1, MIN(r, fsize - byte_read), fpout);

					byte_read += r;
				}
			}
			fclose(fpout);
			return 0;
		}
	}
	return 0;
}

int main(int argc, char **argv)
{
	int i;
	FILE *ar;
	const char *extracted_files[] = {DEBIAN_BINARY, CONTROL_FILE_DEBIAN,
DATA_FILE_DEBIAN, 0};

	if (argc < 2)
		return -1;

	ar = fopen(argv[1], "rb");

	for (i = 0; extracted_files[i]; ++i)
		extract_file(ar, extracted_files[i]);

	fclose(ar);
	return 0;
}


On Mon, Oct 25, 2010 at 12:45 PM, Laszlo Papp <djszapi@archlinux.us> wrote:
> Hello,
>
> I have just attached my 'ar' like program. The purpose is that to
> extract a debian package, but it seems to not work on my armv7. It
> works perfectly on i686, x86_64 host linux distributions.
> When I try to run it on armv7, I get empty or unreasonable files... I
> use libbfd library for this task, please help me :)
>
> Best Regards,
> Laszlo Papp
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]