diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/cmd/tic/tic_main.c | |
download | illumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz |
OpenSolaris Launch
Diffstat (limited to 'usr/src/cmd/tic/tic_main.c')
-rw-r--r-- | usr/src/cmd/tic/tic_main.c | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/usr/src/cmd/tic/tic_main.c b/usr/src/cmd/tic/tic_main.c new file mode 100644 index 0000000000..c5ddc9b6e7 --- /dev/null +++ b/usr/src/cmd/tic/tic_main.c @@ -0,0 +1,276 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 1996, by Sun Microsystems, Inc. + * All Rights reserved. + */ +/* Copyright (c) 1988 AT&T */ +/* All Rights Reserved */ + + +/* + * University Copyright- Copyright (c) 1982, 1986, 1988 + * The Regents of the University of California + * All Rights Reserved + * + * University Acknowledgment- Portions of this document are derived from + * software developed by the University of California, Berkeley, and its + * contributors. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* +************************************************************************* +* 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 Halli * +* Cornell Universityi * +* 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: RCS/comp_main.v $ + * 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 "compiler.h" + +char *source_file = "./terminfo.src"; +char *destination = SRCDIR; +char *usage_string = "[-v[n]] [-c] source-file\n"; +char check_only = 0; +char *progname; + +extern void make_hash_table(); /* should be in a header file :-( */ +extern void compile(); /* should be in a header file :-( */ +extern void syserr_abort(); /* should be in a header file :-( */ +static void init(); + +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; + + 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); + + return(0); +} + +/* + * init() + * + * Miscellaneous initializations + * + * Open source file as standard input + * Change directory to working terminfo directory. + * + */ + +static void +init() +{ + char *env = getenv("TERMINFO"); + + start_time = time((time_t *) 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 stat64 statbuf; + static char dirnames[128]; + static char dir[2] = " "; + + if (dirnames[dirletter] == 0) { + dir[0] = dirletter; + if (stat64(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); + } + } + return; +} + +#include <curses.h> +#if (defined(SYSV) || defined(USG)) && !defined(SIGPOLL) +/* + * mkdir(dirname, mode) + * + * forks and execs the mkdir program to create the given directory + * + */ + +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 |