xref: /minix3/lib/libterminfo/setupterm.c (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /* $NetBSD: setupterm.c,v 1.4 2013/06/07 13:16:18 roy Exp $ */
251e66a47SVivek Prakash 
351e66a47SVivek Prakash /*
40c3ae37fSLionel Sambuc  * Copyright (c) 2009, 2011 The NetBSD Foundation, Inc.
551e66a47SVivek Prakash  *
651e66a47SVivek Prakash  * This code is derived from software contributed to The NetBSD Foundation
751e66a47SVivek Prakash  * by Roy Marples.
851e66a47SVivek Prakash  *
951e66a47SVivek Prakash  * Redistribution and use in source and binary forms, with or without
1051e66a47SVivek Prakash  * modification, are permitted provided that the following conditions
1151e66a47SVivek Prakash  * are met:
1251e66a47SVivek Prakash  * 1. Redistributions of source code must retain the above copyright
1351e66a47SVivek Prakash  *    notice, this list of conditions and the following disclaimer.
1451e66a47SVivek Prakash  * 2. Redistributions in binary form must reproduce the above copyright
1551e66a47SVivek Prakash  *    notice, this list of conditions and the following disclaimer in the
1651e66a47SVivek Prakash  *    documentation and/or other materials provided with the distribution.
1751e66a47SVivek Prakash  *
1851e66a47SVivek Prakash  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1951e66a47SVivek Prakash  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2051e66a47SVivek Prakash  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2151e66a47SVivek Prakash  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2251e66a47SVivek Prakash  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2351e66a47SVivek Prakash  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2451e66a47SVivek Prakash  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2551e66a47SVivek Prakash  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2651e66a47SVivek Prakash  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2751e66a47SVivek Prakash  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2851e66a47SVivek Prakash  */
2951e66a47SVivek Prakash 
3051e66a47SVivek Prakash #include <sys/cdefs.h>
31*84d9c625SLionel Sambuc __RCSID("$NetBSD: setupterm.c,v 1.4 2013/06/07 13:16:18 roy Exp $");
3251e66a47SVivek Prakash 
3351e66a47SVivek Prakash #include <assert.h>
3451e66a47SVivek Prakash #include <err.h>
3551e66a47SVivek Prakash #include <stdio.h>
3651e66a47SVivek Prakash #include <stdlib.h>
3751e66a47SVivek Prakash #include <strings.h>
3851e66a47SVivek Prakash #include <unistd.h>
3951e66a47SVivek Prakash #include <term_private.h>
4051e66a47SVivek Prakash #include <term.h>
4151e66a47SVivek Prakash 
4251e66a47SVivek Prakash #define reterr(code, msg)						      \
4351e66a47SVivek Prakash 	do {								      \
4451e66a47SVivek Prakash 		if (errret == NULL)					      \
4551e66a47SVivek Prakash 			errx(EXIT_FAILURE, msg);			      \
4651e66a47SVivek Prakash 		else {							      \
4751e66a47SVivek Prakash 			*errret = code;					      \
4851e66a47SVivek Prakash 			return ERR;					      \
4951e66a47SVivek Prakash 		}							      \
5051e66a47SVivek Prakash 	} while (0 /* CONSTCOND */)
5151e66a47SVivek Prakash 
5251e66a47SVivek Prakash #define reterrarg(code, msg, arg) \
5351e66a47SVivek Prakash 	do {								      \
5451e66a47SVivek Prakash 		if (errret == NULL)					      \
5551e66a47SVivek Prakash 			errx(EXIT_FAILURE, msg, arg);			      \
5651e66a47SVivek Prakash 		else {							      \
5751e66a47SVivek Prakash 			*errret = code;					      \
5851e66a47SVivek Prakash 			return ERR;					      \
5951e66a47SVivek Prakash 		}							      \
6051e66a47SVivek Prakash 	} while (0 /* CONSTCOND */)
6151e66a47SVivek Prakash 
6251e66a47SVivek Prakash 
6351e66a47SVivek Prakash int
ti_setupterm(TERMINAL ** nterm,const char * term,int fildes,int * errret)6451e66a47SVivek Prakash ti_setupterm(TERMINAL **nterm, const char *term, int fildes, int *errret)
6551e66a47SVivek Prakash {
6651e66a47SVivek Prakash 	int error;
6751e66a47SVivek Prakash 
6851e66a47SVivek Prakash 	_DIAGASSERT(nterm != NULL);
6951e66a47SVivek Prakash 
7051e66a47SVivek Prakash 	if (term == NULL)
7151e66a47SVivek Prakash 		term = getenv("TERM");
7251e66a47SVivek Prakash 	if (term == NULL || *term == '\0') {
7351e66a47SVivek Prakash 		*nterm = NULL;
7451e66a47SVivek Prakash 		reterr(0, "TERM environment variable not set");
7551e66a47SVivek Prakash 	}
7651e66a47SVivek Prakash 	if (fildes == STDOUT_FILENO && !isatty(fildes))
7751e66a47SVivek Prakash 		fildes = STDERR_FILENO;
7851e66a47SVivek Prakash 
7951e66a47SVivek Prakash 	*nterm = calloc(1, sizeof(**nterm));
8051e66a47SVivek Prakash 	if (*nterm == NULL)
8151e66a47SVivek Prakash 		reterr(-1, "not enough memory to create terminal structure");
8251e66a47SVivek Prakash 
8351e66a47SVivek Prakash 	error = _ti_getterm(*nterm, term, 0);
8451e66a47SVivek Prakash 	if (error != 1) {
850c3ae37fSLionel Sambuc 		del_curterm(*nterm);
8651e66a47SVivek Prakash 		*nterm = NULL;
8751e66a47SVivek Prakash 		switch (error) {
8851e66a47SVivek Prakash 		case -1:
8951e66a47SVivek Prakash 			reterr(error, "cannot access the terminfo database");
9051e66a47SVivek Prakash 			/* NOTREACHED */
9151e66a47SVivek Prakash 		case 0:
9251e66a47SVivek Prakash 			reterrarg(error,
9351e66a47SVivek Prakash 			    "%s: terminal not listed in terminfo datase",
9451e66a47SVivek Prakash 			    term);
9551e66a47SVivek Prakash 			/* NOTREACHED */
9651e66a47SVivek Prakash 		default:
9751e66a47SVivek Prakash 			reterr(-1, "unknown error");
9851e66a47SVivek Prakash 			/* NOTREACHED */
9951e66a47SVivek Prakash 		}
10051e66a47SVivek Prakash 	}
10151e66a47SVivek Prakash 
10251e66a47SVivek Prakash 	(*nterm)->fildes = fildes;
10351e66a47SVivek Prakash 	_ti_setospeed(*nterm);
10451e66a47SVivek Prakash 	if (t_generic_type(*nterm))
10551e66a47SVivek Prakash 		reterrarg(0, "%s: generic terminal", term);
10651e66a47SVivek Prakash 	if (t_hard_copy(*nterm))
10751e66a47SVivek Prakash 		reterrarg(1, "%s: hardcopy terminal", term);
10851e66a47SVivek Prakash 	/* POSIX requires 1 for success */
10951e66a47SVivek Prakash 	if (errret)
11051e66a47SVivek Prakash 		*errret = 1;
11151e66a47SVivek Prakash 	return OK;
11251e66a47SVivek Prakash }
11351e66a47SVivek Prakash 
11451e66a47SVivek Prakash int
setupterm(const char * term,int fildes,int * errret)11551e66a47SVivek Prakash setupterm(const char *term, int fildes, int *errret)
11651e66a47SVivek Prakash {
11751e66a47SVivek Prakash 	TERMINAL *nterm;
11851e66a47SVivek Prakash 	int ret;
11951e66a47SVivek Prakash 
12051e66a47SVivek Prakash 	if (errret != NULL)
12151e66a47SVivek Prakash 		*errret = ERR;
12251e66a47SVivek Prakash 	ret = ti_setupterm(&nterm, term, fildes, errret);
12351e66a47SVivek Prakash 	if (nterm != NULL)
12451e66a47SVivek Prakash 		set_curterm(nterm);
12551e66a47SVivek Prakash 	return ret;
12651e66a47SVivek Prakash }
127