ftp.nice.ch/pub/next/unix/developer/NibEditor.NIHS.bs.tar.gz#/NibEditor/extract.c

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.