280 lines
6.3 KiB
C
280 lines
6.3 KiB
C
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
|
||
/* Copyright (c) 1988 AT&T */
|
||
/* All Rights Reserved */
|
||
|
||
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
|
||
/* UNIX System Laboratories, Inc. */
|
||
/* The copyright notice above does not evidence any */
|
||
/* actual or intended publication of such source code. */
|
||
|
||
#ident "@(#)curses:screen/tic_main.c 1.12"
|
||
/*********************************************************************
|
||
* COPYRIGHT NOTICE *
|
||
**********************************************************************
|
||
* This software is copyright (C) 1982 by Pavel Curtis *
|
||
* *
|
||
* Permission is granted to reproduce and distribute *
|
||
* this file by any means so long as no fee is charged *
|
||
* above a nominal handling fee and so long as this *
|
||
* notice is always included in the copies. *
|
||
* *
|
||
* Other rights are reserved except as explicitly granted *
|
||
* by written permission of the author. *
|
||
* Pavel Curtis *
|
||
* Computer Science Dept. *
|
||
* 405 Upson Hall *
|
||
* Cornell University *
|
||
* Ithaca, NY 14853 *
|
||
* *
|
||
* Ph- (607) 256-4934 *
|
||
* *
|
||
* Pavel.Cornell@Udel-Relay (ARPAnet) *
|
||
* decvax!cornell!pavel (UUCPnet) *
|
||
*********************************************************************/
|
||
|
||
/*
|
||
* comp_main.c --- Main program for terminfo compiler
|
||
*
|
||
* $Log: tic_main.c,v $
|
||
* Revision 1.4 1993/09/09 00:03:01 igehy
|
||
* Converted to 64-bit.
|
||
*
|
||
* Revision 1.3 1993/08/04 22:29:34 wtk
|
||
* Fullwarn of libcurses
|
||
*
|
||
* Revision 1.2 1991/12/09 16:33:40 daveh
|
||
* Merge in symlink capability from IRIX,
|
||
*
|
||
* Revision 2.1 82/10/25 14:45:37 pavel
|
||
* Added Copyright Notice
|
||
*
|
||
* Revision 2.0 82/10/24 15:16:37 pavel
|
||
* Beta-one Test Release
|
||
*
|
||
* Revision 1.3 82/08/23 22:29:36 pavel
|
||
* The REAL Alpha-one Release Version
|
||
*
|
||
* Revision 1.2 82/08/19 19:09:49 pavel
|
||
* Alpha Test Release One
|
||
*
|
||
* Revision 1.1 82/08/12 18:36:55 pavel
|
||
* Initial revision
|
||
*
|
||
*
|
||
*/
|
||
|
||
|
||
#define EXTERN /* EXTERN=extern in other .c files */
|
||
#include <sys/types.h>
|
||
#include <sys/stat.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
#include "curses_inc.h"
|
||
#include "compiler.h"
|
||
|
||
static void init(void);
|
||
|
||
char *source_file = "./terminfo.src";
|
||
char *destination = SRCDIR;
|
||
char check_only = 0;
|
||
char *progname;
|
||
|
||
#ifdef _SGI_SOURCE
|
||
int symlinks;
|
||
char *usage_string = "[-v[n]] [-s] [-c] source-file\n";
|
||
#else
|
||
char *usage_string = "[-v[n]] [-c] source-file\n";
|
||
#endif
|
||
|
||
main (int argc, char *argv[])
|
||
{
|
||
int i;
|
||
int argflag = FALSE;
|
||
|
||
debug_level = 0;
|
||
progname = argv[0];
|
||
|
||
umask(022);
|
||
|
||
for (i=1; i < argc; i++)
|
||
{
|
||
if (argv[i][0] == '-')
|
||
{
|
||
switch (argv[i][1])
|
||
{
|
||
case 'c':
|
||
check_only = 1;
|
||
break;
|
||
|
||
case 'v':
|
||
debug_level = argv[i][2] ? atoi(&argv[i][2]) : 1;
|
||
break;
|
||
#ifdef _SGI_SOURCE
|
||
case 's':
|
||
/* use symbolic links instead of hard ones */
|
||
symlinks = 1;
|
||
break;
|
||
#endif
|
||
default:
|
||
fprintf(stderr,
|
||
"%s: Unknown option. Usage is:\n\t%s: %s\n",
|
||
argv[0],
|
||
progname,
|
||
usage_string);
|
||
exit(1);
|
||
}
|
||
}
|
||
else if (argflag)
|
||
{
|
||
fprintf(stderr, "%s: Too many file names. Usage is:\n\t%s\n",
|
||
argv[0], usage_string);
|
||
exit(1);
|
||
}
|
||
else
|
||
{
|
||
argflag = TRUE;
|
||
source_file = argv[i];
|
||
}
|
||
}
|
||
|
||
init();
|
||
make_hash_table();
|
||
compile();
|
||
|
||
exit(0);
|
||
}
|
||
|
||
/*
|
||
* init()
|
||
*
|
||
* Miscellaneous initializations
|
||
*
|
||
* Open source file as standard input
|
||
* Change directory to working terminfo directory.
|
||
*
|
||
*/
|
||
|
||
static void
|
||
init(void)
|
||
{
|
||
char *env = getenv("TERMINFO");
|
||
|
||
start_time = time((long *) 0);
|
||
|
||
curr_line = 0;
|
||
|
||
if (freopen(source_file, "r", stdin) == NULL)
|
||
{
|
||
fprintf(stderr, "%s: Can't open %s\n", progname, source_file);
|
||
exit(1);
|
||
}
|
||
|
||
if (env && *env)
|
||
destination = env;
|
||
|
||
if (check_only) {
|
||
DEBUG(1,"Would be working in %s\n",destination);
|
||
} else {
|
||
DEBUG(1,"Working in %s\n",destination);
|
||
}
|
||
|
||
if (access(destination, 7) < 0)
|
||
{
|
||
fprintf(stderr, "%s: %s nonexistent or permission denied\n",
|
||
progname, destination);
|
||
exit(1);
|
||
}
|
||
|
||
if (chdir(destination) < 0)
|
||
{
|
||
fprintf(stderr, "%s: %s is not a directory\n",
|
||
progname, destination);
|
||
exit(1);
|
||
}
|
||
|
||
}
|
||
|
||
/*
|
||
*
|
||
* check_dir(dirletter)
|
||
*
|
||
* Check for access rights to the destination directory.
|
||
* Create any directories which don't exist.
|
||
*
|
||
*/
|
||
|
||
void
|
||
check_dir(char dirletter)
|
||
{
|
||
struct stat statbuf;
|
||
static char dirnames[128];
|
||
static char dir[2] = " ";
|
||
|
||
if (dirnames[dirletter] == 0)
|
||
{
|
||
dir[0] = dirletter;
|
||
if (stat(dir, &statbuf) < 0)
|
||
{
|
||
if (mkdir(dir, 0755) < 0)
|
||
syserr_abort("mkdir %s returned bad status", dir);
|
||
dirnames[dirletter] = 1;
|
||
}
|
||
else if (access(dir, 7) < 0)
|
||
{
|
||
fprintf(stderr, "%s: %s/%s: Permission denied\n",
|
||
progname, destination, dir);
|
||
perror(dir);
|
||
exit(1);
|
||
}
|
||
else if ((statbuf.st_mode & S_IFMT) != S_IFDIR)
|
||
{
|
||
fprintf(stderr, "%s: %s/%s: Not a directory\n",
|
||
progname, destination, dir);
|
||
perror(dir);
|
||
exit(1);
|
||
}
|
||
}
|
||
}
|
||
|
||
#include <curses.h>
|
||
#if (defined(SYSV) || defined(USG)) && !defined(SIGPOLL)
|
||
/*
|
||
* mkdir(dirname, mode)
|
||
*
|
||
* forks and execs the mkdir program to create the given directory
|
||
*
|
||
*/
|
||
|
||
int
|
||
mkdir(dirname, mode)
|
||
#ifdef __STDC__
|
||
const
|
||
#endif
|
||
char *dirname;
|
||
int mode;
|
||
{
|
||
int fork_rtn;
|
||
int status;
|
||
|
||
fork_rtn = fork();
|
||
|
||
switch (fork_rtn)
|
||
{
|
||
case 0: /* Child */
|
||
(void) execl("/bin/mkdir", "mkdir", dirname, (char*)0);
|
||
_exit(1);
|
||
|
||
case -1: /* Error */
|
||
fprintf(stderr, "%s: SYSTEM ERROR!! Fork failed!!!\n",
|
||
progname);
|
||
exit(1);
|
||
|
||
default:
|
||
(void) wait(&status);
|
||
if ((status != 0) || (chmod(dirname, mode) == -1))
|
||
return -1;
|
||
return 0;
|
||
}
|
||
}
|
||
#endif
|