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