⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 px_header.c

📁 早期freebsd实现
💻 C
字号:
/*- * Copyright (c) 1980, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char copyright[] ="@(#) Copyright (c) 1980, 1993\n\	The Regents of the University of California.  All rights reserved.\n";#endif /* not lint */#ifndef lintstatic char sccsid[] = "@(#)px_header.c	8.1 (Berkeley) 6/6/93";#endif /* not lint *//* * pxheader - program to sit in front of interpreter code to make shell mods *	      unnecessary to make Pascal obj's look like real programs. * * Bill Joy UCB February 6, 1978 */#include <stdio.h>#include <sys/types.h>#include <a.out.h>#include "config.h"#include "whoami.h"#include "objfmt.h"#define	ETXTBSY	26#define	ADDR_LC \	(START + HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr))#define MAXARGS 512extern	errno;main(argc, argv)	register int argc;	register char *argv[];{	register int i;	int codesiz, symtabsiz;	register char *cp;	char *largv[MAXARGS];	int fd, pv[2], pid;	cp = (char *)(ADDR_LC);	codesiz = ((struct pxhdr *)(cp))->objsize + sizeof(struct pxhdr);	symtabsiz = ((struct pxhdr *)(cp))->symtabsize;	if (argc > MAXARGS - 3)		error(2, "Too many arguments.\n");	if (symtabsiz != 0) {		largv[0] = "pxhdr";		largv[1] = "/tmp/px00000";		cp = &largv[1][11];		for (i = getpid(); i > 0; i /= 10)			*cp-- = '0' + i % 10;		fd = creat(largv[1], 0444);		if (fd < 0)			error(3, "Cannot create /tmp file\n");		for (i = 0; i < argc; i++)			largv[i + 2] = argv[i];		largv[argc + 2] = 0;		writeobj(fd, codesiz, symtabsiz);		run(px_debug, largv);		/* no return */	}	largv[0] = "pipe";	for (i = 0; i < argc; i++)		largv[i + 1] = argv[i];	largv[argc + 1] = 0;	pipe(pv);	pid = fork();	if (pid != 0) {		if (pv[0] != 3) {			close(3);			dup(pv[0]);			close(pv[0]);		}		close(pv[1]);		run(px_intrp, largv);		/* no return */	}	writeobj(pv[1], codesiz, symtabsiz);	exit(0);}writeobj(fd, codesiz, symtabsiz)	int fd;	int codesiz, symtabsiz;{	int i;	register char *cp;	cp = (char *)(ADDR_LC);	while (codesiz != 0) {		i = (codesiz < BUFSIZ) ? codesiz : BUFSIZ;		write(fd, cp, i);		cp += i;		codesiz -= i;	}	while (symtabsiz != 0) {		i = (symtabsiz < BUFSIZ) ? symtabsiz : BUFSIZ;		write(fd, cp, i);		cp += i;		symtabsiz -= i;	}	close(fd);}run(prog, args)	char *prog;	char **args;{	for (;;) {		execv(prog, args);		if (errno != ETXTBSY)			break;		sleep(2);	}	error(0, prog);	error(1, " not found.\n");}error(errcode, cp)	int errcode;	register char *cp;{	register int i;	register char *dp;	dp = cp;	i = 0;	while (*dp++)		i++;	write(2, cp, i);	if (errcode)		exit(errcode);}exit(i){	_exit(i);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -