[BACK]Return to setupterm.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libterminfo

Annotation of src/lib/libterminfo/setupterm.c, Revision 1.8

1.8     ! roy         1: /* $NetBSD: setupterm.c,v 1.7 2017/03/23 00:55:39 roy Exp $ */
1.1       roy         2:
                      3: /*
1.3       roy         4:  * Copyright (c) 2009, 2011 The NetBSD Foundation, Inc.
1.1       roy         5:  *
                      6:  * This code is derived from software contributed to The NetBSD Foundation
                      7:  * by Roy Marples.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  *
                     18:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     19:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     20:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     21:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     22:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     23:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     24:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     25:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     26:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     27:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     28:  */
                     29:
                     30: #include <sys/cdefs.h>
1.8     ! roy        31: __RCSID("$NetBSD: setupterm.c,v 1.7 2017/03/23 00:55:39 roy Exp $");
1.1       roy        32:
1.7       roy        33: #include <sys/ioctl.h>
1.1       roy        34: #include <assert.h>
                     35: #include <err.h>
1.7       roy        36: #include <stdbool.h>
1.1       roy        37: #include <stdio.h>
                     38: #include <stdlib.h>
                     39: #include <strings.h>
                     40: #include <unistd.h>
                     41: #include <term_private.h>
                     42: #include <term.h>
                     43:
1.7       roy        44: /*
                     45:  * use_env is really a curses function - POSIX mandates it's in curses.h
                     46:  * But it has to live in terminfo because it must precede a call to setupterm().
                     47:  */
                     48: #include <curses.h>
                     49:
                     50: static bool __use_env = true;
                     51:
                     52: void
                     53: use_env(bool value)
                     54: {
                     55:
                     56:        __use_env = value;
                     57: }
1.1       roy        58: #define reterr(code, msg)                                                    \
                     59:        do {                                                                  \
                     60:                if (errret == NULL)                                           \
                     61:                        errx(EXIT_FAILURE, msg);                              \
                     62:                else {                                                        \
                     63:                        *errret = code;                                       \
                     64:                        return ERR;                                           \
                     65:                }                                                             \
                     66:        } while (0 /* CONSTCOND */)
                     67:
                     68: #define reterrarg(code, msg, arg) \
                     69:        do {                                                                  \
                     70:                if (errret == NULL)                                           \
                     71:                        errx(EXIT_FAILURE, msg, arg);                         \
                     72:                else {                                                        \
                     73:                        *errret = code;                                       \
                     74:                        return ERR;                                           \
                     75:                }                                                             \
                     76:        } while (0 /* CONSTCOND */)
                     77:
                     78:
                     79: int
                     80: ti_setupterm(TERMINAL **nterm, const char *term, int fildes, int *errret)
                     81: {
                     82:        int error;
1.7       roy        83:        struct winsize win;
1.1       roy        84:
                     85:        _DIAGASSERT(nterm != NULL);
                     86:
1.4       roy        87:        if (term == NULL)
1.1       roy        88:                term = getenv("TERM");
1.2       roy        89:        if (term == NULL || *term == '\0') {
                     90:                *nterm = NULL;
                     91:                reterr(0, "TERM environment variable not set");
                     92:        }
1.1       roy        93:        if (fildes == STDOUT_FILENO && !isatty(fildes))
                     94:                fildes = STDERR_FILENO;
1.4       roy        95:
1.1       roy        96:        *nterm = calloc(1, sizeof(**nterm));
                     97:        if (*nterm == NULL)
                     98:                reterr(-1, "not enough memory to create terminal structure");
                     99:
                    100:        error = _ti_getterm(*nterm, term, 0);
                    101:        if (error != 1) {
1.3       roy       102:                del_curterm(*nterm);
1.1       roy       103:                *nterm = NULL;
                    104:                switch (error) {
                    105:                case -1:
                    106:                        reterr(error, "cannot access the terminfo database");
                    107:                        /* NOTREACHED */
                    108:                case 0:
                    109:                        reterrarg(error,
                    110:                            "%s: terminal not listed in terminfo datase",
                    111:                            term);
                    112:                        /* NOTREACHED */
                    113:                default:
                    114:                        reterr(-1, "unknown error");
                    115:                        /* NOTREACHED */
                    116:                }
                    117:        }
1.4       roy       118:
1.1       roy       119:        (*nterm)->fildes = fildes;
                    120:        _ti_setospeed(*nterm);
                    121:        if (t_generic_type(*nterm))
                    122:                reterrarg(0, "%s: generic terminal", term);
                    123:        if (t_hard_copy(*nterm))
                    124:                reterrarg(1, "%s: hardcopy terminal", term);
1.7       roy       125:
                    126:        /* If TIOCGWINSZ works, then set initial lines and columns. */
                    127:        if (ioctl(fildes, TIOCGWINSZ, &win) != -1 &&
                    128:            win.ws_row != 0 && win.ws_col != 0)
                    129:        {
1.8     ! roy       130:                t_lines(*nterm) = (short)win.ws_row;
        !           131:                t_columns(*nterm) = (short)win.ws_col;
1.7       roy       132:        }
                    133:
                    134:        /* POSIX 1003.2 requires that the environment override. */
                    135:        if (__use_env) {
                    136:                char *p;
                    137:
                    138:                if ((p = getenv("LINES")) != NULL)
1.8     ! roy       139:                        t_lines(*nterm) = (short)strtol(p, NULL, 0);
1.7       roy       140:                if ((p = getenv("COLUMNS")) != NULL)
1.8     ! roy       141:                        t_columns(*nterm) = (short)strtol(p, NULL, 0);
1.7       roy       142:        }
                    143:
1.1       roy       144:        /* POSIX requires 1 for success */
                    145:        if (errret)
                    146:                *errret = 1;
                    147:        return OK;
                    148: }
                    149:
                    150: int
                    151: setupterm(const char *term, int fildes, int *errret)
                    152: {
                    153:        TERMINAL *nterm;
                    154:        int ret;
                    155:
                    156:        if (errret != NULL)
                    157:                *errret = ERR;
                    158:        ret = ti_setupterm(&nterm, term, fildes, errret);
                    159:        if (nterm != NULL)
                    160:                set_curterm(nterm);
                    161:        return ret;
                    162: }

CVSweb <webmaster@jp.NetBSD.org>