This is seekNeXT.c in view mode; [Download] [Up]
/*
* seekNeXT.c: SEEK_TO_END_OFILE(fp) for NeXT computers
*
* by Noritake Yonezawa, April 26 1991
*/
#define MACH_O
#undef A_OUT
#include <stdio.h>
#include <ar.h>
#include <nlist.h>
#include <sys/types.h>
#include <sys/file.h>
#if !defined(A_OUT) && !defined(MACH_O)
#define A_OUT
#endif
#ifdef A_OUT
#include <a.out.h>
#endif
#ifdef MACH_O
#include <sys/loader.h>
#endif
#include <strings.h>
char *malloc();
#ifdef MAIN
void
main(int argc,
char **argv)
{
char command[50];
FILE *fp;
char c;
if (argc != 2) {
fprintf(stderr, "Usage: %s file\n", argv[0]);
exit(1);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
perror(argv[1]);
exit(1);
}
if (!seek_to_end_ofile(fp)) {
fclose(fp);
fprintf(stderr, "something wrong\n");
exit(1);
}
while ((c = fgetc(fp)) != EOF)
putchar(c);
close(fp);
sprintf(command, "/bin/ls -l %s", argv[1]);
system(command);
}
#endif
int
seek_to_end_ofile(FILE * fp)
{
#ifdef A_OUT
{
struct exec hdr;
int i;
fseek(fp, 0L, 0);
#ifdef HEADER_SEEK_FD
/*
* Skip the headers that encapsulate our data in some other format such
* as COFF.
*/
HEADER_SEEK_FD(desc);
#endif
if (fread(&hdr, sizeof(struct exec), 1, fp) && !N_BADMAG(hdr)) {
#ifdef MAIN
fprintf(stderr, "Hmm... it looks an a.out format\n");
#endif
fseek(fp, hdr.a_text + hdr.a_data +
hdr.a_syms + hdr.a_trsize + hdr.a_drsize, 1);
fread(&i, sizeof(i), 1, fp);
fseek(fp, i - sizeof(i), 1);
#ifdef MAIN
fprintf(stderr, "ftell = %d\n", ftell(fp));
#endif
return 1;
}
}
#endif /* A_OUT */
#ifdef MACH_O
{
struct mach_header mach_header;
char *hdrbuf;
struct load_command *load_command;
struct segment_command *segment_command;
struct section *section;
struct symtab_command *symtab_command;
struct symseg_command *symseg_command;
int len, cmd, seg;
int end_sec, end_ofile;
end_ofile = 0;
fseek(fp, 0L, 0);
len = fread((char *)&mach_header, sizeof(struct mach_header), 1, fp);
if (len == 1 && mach_header.magic == MH_MAGIC) {
#ifdef MAIN
fprintf(stderr, "Hmm... it looks a Mach-O format\n");
#endif
hdrbuf = malloc(mach_header.sizeofcmds);
len = fread(hdrbuf, mach_header.sizeofcmds, 1, fp);
if (len != 1) {
fprintf(stderr, "failure reading Mach-O load commands\n");
return 0;
}
load_command = (struct load_command *) hdrbuf;
for (cmd = 0; cmd < mach_header.ncmds; ++cmd) {
switch (load_command->cmd) {
case LC_SEGMENT:
segment_command = (struct segment_command *) load_command;
section = (struct section *) ((char *)(segment_command + 1));
for (seg = 0; seg < segment_command->nsects; ++seg, ++section) {
end_sec = section->offset + section->size;
if (end_sec > end_ofile)
end_ofile = end_sec;
}
break;
case LC_SYMTAB:
symtab_command = (struct symtab_command *) load_command;
end_sec = symtab_command->symoff + symtab_command->nsyms * sizeof(struct nlist);
if (end_sec > end_ofile)
end_ofile = end_sec;
end_sec = symtab_command->stroff + symtab_command->strsize;
if (end_sec > end_ofile)
end_ofile = end_sec;
break;
case LC_SYMSEG:
symseg_command = (struct symseg_command *) load_command;
end_sec = symseg_command->offset + symseg_command->size;
if (end_sec > end_ofile)
end_ofile = end_sec;
break;
}
load_command = (struct load_command *)
((char *)load_command + load_command->cmdsize);
}
free(hdrbuf);
fseek(fp, end_ofile, 0);
#ifdef MAIN
fprintf(stderr, "end_ofile = %u\n", end_ofile);
fprintf(stderr, "ftell = %d\n", ftell(fp));
#endif
return 1;
}
}
#endif /* MACH_O */
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.