This is extract.c in view mode; [Download] [Up]
/* * extract.c: * * Make a list of all of the nibs in an executable; extract them and put * them into files ending with ".nib" * */ #include <libc.h> FILE *nibfile; char **niblist; int nibs=0; char *prog; void usage() { printf("usage: extract <program-to-extract>\n"); exit(1); } void extract(char *nibname) { char buf[512]; char filename[512]; char *cc; struct stat sbuf; strcpy(filename,nibname); /* see if the last four characters are ".nib". If not, then add * them... */ printf("Extracting %s "); cc = filename+strlen(filename); if(cc[-4]!='.' || cc[-3]!='n' || cc[-2]!='i' || cc[-1]!='b'){ strcat(filename,".nib"); printf("--> %s ",filename); } sprintf(buf,"/bin/segedit -extract __NIB %s %s %s", nibname,filename,prog); system(buf); stat(filename,&sbuf); printf("\n"); fprintf(nibfile,"%s %s %ld\n",nibname,filename,sbuf.st_mtime); } /* Process a section; capture the section name and look for * segment name __NIB */ void do_section(FILE *pout) { char sectname[256]; char segname[256]; char *cc; sectname[0] = '\000'; segname[0] = '\000'; fgets(sectname,sizeof(sectname),pout); if(strncmp(sectname," sectname ",11)){ printf("section: %s",sectname); return; } if((cc=index(sectname,'\n'))!=0){ *cc = '\000'; } fgets(segname,sizeof(segname),pout); if(strcmp(segname," segname __NIB\n")) return; /* I've got a NIB; add it to the list. */ niblist = realloc(niblist,sizeof(char *) * (nibs+1)); niblist[nibs] = malloc(strlen(sectname)+1); strcpy(niblist[nibs],sectname+11); nibs++; return; } int main(int argc,char **argv) { FILE *pout; char *buf; int i; if(argc!=2){ usage(); } nibfile = fopen("NIBLIST","w"); niblist = malloc(0); nibs = 0; prog = argv[1]; buf = alloca(strlen(prog)+20); sprintf(buf,"otool -l %s",prog); pout = popen(buf,"r"); while(!feof(pout)){ char lbuf[256]; fgets(lbuf,sizeof(lbuf),pout); if(!strcmp(lbuf,"Section\n")){ do_section(pout); } } pclose(pout); printf("Program: %s\nnibs: %d\n",prog,nibs); /* Now extract each nib... */ for(i=0;i<nibs;i++){ extract(niblist[i]); } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.