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

Annotation of src/lib/libutil/ttyaction.c, Revision 1.13

1.13    ! lukem       1: /*     $NetBSD: ttyaction.c,v 1.12 1999/09/16 11:45:51 lukem Exp $     */
1.1       gwr         2:
                      3: /*-
                      4:  * Copyright (c) 1996 The NetBSD Foundation, Inc.
                      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
                      8:  * by Gordon W. Ross.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *        This product includes software developed by the NetBSD
                     21:  *        Foundation, Inc. and its contributors.
                     22:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     23:  *    contributors may be used to endorse or promote products derived
                     24:  *    from this software without specific prior written permission.
                     25:  *
                     26:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     27:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     28:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1.8       jtc        29:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     30:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1.1       gwr        31:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     32:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     33:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     34:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     35:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     36:  * POSSIBILITY OF SUCH DAMAGE.
                     37:  */
                     38:
                     39: /*
                     40:  * For each matching "tty" and "action" run the "command."
                     41:  * See fnmatch() for matching the tty name.
                     42:  */
                     43:
                     44: #include <sys/types.h>
                     45: #include <sys/wait.h>
                     46:
1.12      lukem      47: #include <assert.h>
1.6       mycroft    48: #include <err.h>
1.1       gwr        49: #include <errno.h>
                     50: #include <fcntl.h>
1.7       mikel      51: #include <fnmatch.h>
1.12      lukem      52: #include <paths.h>
                     53: #include <stdio.h>
1.1       gwr        54: #include <stdlib.h>
                     55: #include <string.h>
1.12      lukem      56: #include <unistd.h>
1.1       gwr        57:
                     58: #include "util.h"
                     59:
                     60: #ifndef _PATH_TTYACTION
                     61: #define _PATH_TTYACTION "/etc/ttyaction"
                     62: #endif
                     63:
                     64: static char *actfile = _PATH_TTYACTION;
1.7       mikel      65: static char *pathenv = __CONCAT("PATH=",_PATH_STDPATH);
1.1       gwr        66:
                     67: int
                     68: ttyaction(tty, act, user)
1.9       mycroft    69:        const char *tty;
                     70:        const char *act;
                     71:        const char *user;
1.1       gwr        72: {
                     73:        FILE *fp;
                     74:        char *p1, *p2;
                     75:        char *argv[4];
                     76:        char *envp[8];
1.11      kleink     77:        char *lastp;
1.1       gwr        78:        char line[1024];
                     79:        char env_tty[64];
                     80:        char env_act[64];
                     81:        char env_user[256];
1.10      christos   82:        int error, linenum, pid, status;
1.1       gwr        83:
1.12      lukem      84:        _DIAGASSERT(tty != NULL);
                     85:        _DIAGASSERT(act != NULL);
                     86:        _DIAGASSERT(user != NULL);
                     87:
1.1       gwr        88:        fp = fopen(actfile, "r");
                     89:        if (fp == NULL)
                     90:                return 0;
                     91:
1.2       gwr        92:        /* Skip the "/dev/" part of the first arg. */
                     93:        if (!strncmp(tty, "/dev/", 5))
                     94:                tty += 5;
                     95:
1.1       gwr        96:        /* Args will be: "sh -c ..." */
                     97:        argv[0] = _PATH_BSHELL;
                     98:        argv[1] = "-c";
                     99:        argv[2] = NULL; /* see below */
                    100:        argv[3] = NULL;
                    101:
1.3       gwr       102:        /*
                    103:         * Environment needs: TTY, ACT, USER
                    104:         */
1.4       gwr       105:        snprintf(env_tty, sizeof(env_tty), "TTY=%s", tty);
                    106:        snprintf(env_act, sizeof(env_act), "ACT=%s", act);
                    107:        snprintf(env_user, sizeof(env_user), "USER=%s", user);
1.1       gwr       108:        envp[0] = pathenv;
                    109:        envp[1] = env_tty;
                    110:        envp[2] = env_act;
                    111:        envp[3] = env_user;
                    112:        envp[4] = NULL;
                    113:
                    114:        linenum = 0;
                    115:        status = 0;
                    116:        while (fgets(line, sizeof(line), fp)) {
1.2       gwr       117:                linenum++;
                    118:
                    119:                /* Allow comment lines. */
                    120:                if (line[0] == '#')
                    121:                        continue;
1.1       gwr       122:
1.11      kleink    123:                p1 = strtok_r(line, " \t", &lastp);
                    124:                p2 = strtok_r(NULL, " \t", &lastp);
1.1       gwr       125:                /* This arg goes to end of line. */
1.11      kleink    126:                argv[2] = strtok_r(NULL, "\n", &lastp);
1.1       gwr       127:                if (!p1 || !p2 || !argv[2]) {
                    128:                        warnx("%s: line %d format error", actfile, linenum);
                    129:                        continue;
                    130:                }
                    131:                if (fnmatch(p1, tty, 0) || fnmatch(p2, act, 0))
                    132:                        continue;
                    133:                /* OK, this is a match.  Run the command. */
                    134:                pid = fork();
                    135:                if (pid == -1) {
                    136:                        warnx("fork failed: %s", strerror(errno));
                    137:                        continue;
                    138:                }
                    139:                if (pid == 0) {
                    140:                        /* This is the child. */
1.10      christos  141:                        error = execve(argv[0], argv, envp);
1.1       gwr       142:                        /* If we get here, it is an error. */
                    143:                        warnx("%s: line %d: exec failed: %s",
                    144:                                  actfile, linenum, strerror(errno));
1.5       gwr       145:                        _exit(1);
1.1       gwr       146:                }
                    147:                /* This is the parent. */
1.10      christos  148:                error = waitpid(pid, &status, 0);
                    149:                if (error == -1) {
1.1       gwr       150:                        warnx("%s: line %d: wait failed: %s",
                    151:                                  actfile, linenum, strerror(errno));
                    152:                        continue;
                    153:                }
                    154:                if (WTERMSIG(status)) {
                    155:                        warnx("%s: line %d: child died with signal %d",
                    156:                                  actfile, linenum, WTERMSIG(status));
                    157:                        continue;
                    158:                }
                    159:        }
                    160:        fclose(fp);
                    161:        return status;
                    162: }

CVSweb <webmaster@jp.NetBSD.org>