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

📄 chgtinfo.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/*	Copyright (c) 1984 AT&T	*//*	  All Rights Reserved  	*//*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*//*	The copyright notice above does not evidence any   	*//*	actual or intended publication of such source code.	*/#ifndef lintstatic	char sccsid[] = "@(#)chgtinfo.c 1.1 92/07/30 SMI"; /* from S5R3.1 1.1 */#endif#include <curses.h>#include <signal.h>/*    NAME	modifyinfo - create a temporary version of a terminfo entry    SYNOPSIS	TERMINFO=`modifyinfo modifications` program	export TERMINFO    DESCRIPTION	One of the touted drawbacks of terminfo has been that one could	not create a temporary modification of a terminfo entry.	The terminfo-modifications are actual terminfo source statements	and are simply passed on to tic for it to compile.    EXAMPLES	TERMINFO=`chgtinfo xhp, xon@, smso@, smul=\E[99m,`	export TERMINFO	This will set xhp, remove xon and smso, and add or change	smul to the new value.    AUTHOR	Tony Hansen, May 29, 1986.*/extern char *getenv();extern void exit(), _exit();char *progname;int rmstate = 0;char TMPtermfile[512];char *dirname;/* routine to remove files if program dies for some reason */#ifdef SIGPOLLvoid doremoves()#elseint doremoves()#endif{    switch (rmstate)	{	default:	case 3:	    (void) unlink("tmp.ti");	    /* no break */	case 2:	    (void) unlink(TMPtermfile);	    /* no break */	case 1:	    (void) chdir("/");	    (void) rmdir(dirname);	case 0:	    break;	}    exit(1);}/* error exit routine */void errexit(msg)char *msg;{    (void) fprintf (stderr, "%s: %s\n", progname, msg);    doremoves();}void usage(){    (void) fprintf (stderr, "usage: %s terminfo-modifications\n", progname);    exit(1);}int findtermfile(terminfo, term)char *terminfo, *term;{    char termfile[512];    if (terminfo && *terminfo)	{	(void) sprintf(termfile, "%s/%c/%s", terminfo, *term, term);	if ((access(termfile, 0) == 0) &&	    copy(termfile, TMPtermfile))	    return 1;	}    return 0;}main(argc, argv)int argc;char **argv;{    register int i;    register char *term = getenv("TERM");    register FILE *tmpfp;    char cmdbuf[512];    progname = argv[0];    /* check $TERM and usage */    if (!term || !*term)	errexit("TERM not set");    if (argc == 1)	usage();    /* catch signals */    if (signal(SIGINT, SIG_IGN) != SIG_IGN)	(void) signal(SIGINT, doremoves);    if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)	(void) signal(SIGQUIT, doremoves);    /* create temporary directories */    dirname = tempnam((char*) 0, "tinfo");    if (!dirname)	errexit("tempnam() failed");    if (mkdir(dirname, 0755) < 0)	errexit("mkdir() failed");    rmstate++;    if (chdir(dirname) < 0)	errexit("chdir() failed");    if (mkdir(*term, 0755) < 0)	errexit("mkdir() failed");    rmstate++;    /* copy the current $TERM file to terminal named ?TMP+TMP */    /* where ? is the first letter of $TERM */    (void) sprintf(TMPtermfile, "%s/%c/%cTMP+TMP", dirname, *term, *term);    if (!findtermfile(getenv("TERMINFO"), term) &&	!findtermfile("/usr/lib/terminfo", term))	errexit("Cannot find terminfo file");    rmstate++;    /* create a temporary .ti file that references use=?TMP+TMP */    if (!(tmpfp = fopen("tmp.ti", "w")))	errexit("Cannot open temp file");    rmstate++;    if (fprintf (tmpfp, "%s|modified version of %s,\n", term, term) == EOF)	errexit("Cannot write to temp file");    for (i = 1; i < argc; i++)	if (fprintf (tmpfp, "\t%s\n", argv[i]) == EOF)	    errexit("Cannot write to temp file");    if (fprintf (tmpfp, "\tuse=%cTMP+TMP,\n", *term) == EOF)	errexit("Cannot write to temp file");    if (fclose (tmpfp) == EOF)	errexit("Cannot close temp file");    /* start up tic on tmp.ti */    (void) sprintf(cmdbuf, "TERMINFO=%s tic tmp.ti", dirname);    if (system(cmdbuf) != 0)	errexit("tic failed");    /* clean up unnecessary files */    (void) unlink("tmp.ti");    (void) unlink(TMPtermfile);    /* print out directory name */    (void) printf("%s\n", dirname);    exit(0);    /*NOTREACHED*/}#if (defined(SYSV) || defined(USG)) && !defined(SIGPOLL)/* *	mkdir(dirname, mode) * *	forks and execs the mkdir program to create the given directory * */mkdir(directory, mode)char	*directory;int mode;{    int	fork_rtn;    int	status;    fork_rtn = fork();    switch (fork_rtn)	{	case 0:		/* Child */	    (void) execl("/bin/mkdir", "mkdir", directory, (char*)0);	    _exit(1);	case -1:	/* Error */	    errexit("Fork() failed!");	    return -1;	default:	    (void) wait(&status);	    if (!status)		return chmod(directory, mode);	    return -1;	}}/* *	rmdir(dirname) * *	forks and execs the rmdir program to remove the given directory * */int rmdir(directory)char *directory;{    int	fork_rtn;    int	status;    fork_rtn = fork();    switch (fork_rtn)	{	case 0:		/* Child */	    (void) execl("/bin/rmdir", "rmdir", directory, (char*)0);	    _exit(1);	case -1:	/* Error */	    errexit("Fork() failed!");	    return -1;	default:	    (void) wait(&status);	    return !status;	}}#endif/* copy file f1 into file f2 */#include <fcntl.h>int copy(f1, f2)char *f1, *f2;{    register int infd, outfd, n, ret;    char buf[BUFSIZ];    infd = open(f1, O_RDONLY);    if (infd < 0)	return 0;    outfd = creat(f2, 0644);    if (outfd < 0)	{	(void) close(infd);	return 0;	}    ret = 1;    while ((n = read(infd, buf, sizeof(buf))) > 0)	if (write(outfd, buf, n) != n)	    {	    ret = 0;	    break;	    }    (void) close(infd);    (void) close(infd);    return ret;}

⌨️ 快捷键说明

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