Blame src/util/ss/help.c

Packit fd8b60
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
Packit fd8b60
/*
Packit fd8b60
 * Copyright 1987, 1988 by MIT Student Information Processing Board
Packit fd8b60
 *
Packit fd8b60
 * For copyright info, see copyright.h.
Packit fd8b60
 */
Packit fd8b60
Packit fd8b60
#include <sys/param.h>
Packit fd8b60
#include <sys/types.h>
Packit fd8b60
#include <errno.h>
Packit fd8b60
#include <sys/file.h>
Packit fd8b60
#include <fcntl.h>      /* just for O_* */
Packit fd8b60
#include <sys/wait.h>
Packit fd8b60
#include "ss_internal.h"
Packit fd8b60
#include "copyright.h"
Packit fd8b60
Packit fd8b60
Packit fd8b60
void ss_help (argc, argv, sci_idx, info_ptr)
Packit fd8b60
    int argc;
Packit fd8b60
    char const * const *argv;
Packit fd8b60
    int sci_idx;
Packit fd8b60
    pointer info_ptr;
Packit fd8b60
{
Packit fd8b60
    char buffer[MAXPATHLEN];
Packit fd8b60
    char const *request_name;
Packit fd8b60
    int code;
Packit fd8b60
    int fd, child;
Packit fd8b60
    int idx;
Packit fd8b60
    ss_data *info;
Packit fd8b60
Packit fd8b60
    request_name = ss_current_request(sci_idx, &code);
Packit fd8b60
    if (code != 0) {
Packit fd8b60
        ss_perror(sci_idx, code, "");
Packit fd8b60
        return;         /* no ss_abort_line, if invalid invocation */
Packit fd8b60
    }
Packit fd8b60
    if (argc == 1) {
Packit fd8b60
        ss_list_requests(argc, argv, sci_idx, info_ptr);
Packit fd8b60
        return;
Packit fd8b60
    }
Packit fd8b60
    else if (argc != 2) {
Packit fd8b60
        /* should do something better than this */
Packit fd8b60
        snprintf(buffer, sizeof(buffer),
Packit fd8b60
                 "usage:\n\t%s [topic|command]\nor\t%s\n",
Packit fd8b60
                 request_name, request_name);
Packit fd8b60
        ss_perror(sci_idx, 0, buffer);
Packit fd8b60
        return;
Packit fd8b60
    }
Packit fd8b60
    info = ss_info(sci_idx);
Packit fd8b60
    if (info->info_dirs == (char **)NULL) {
Packit fd8b60
        ss_perror(sci_idx, SS_ET_NO_INFO_DIR, (char *)NULL);
Packit fd8b60
        return;
Packit fd8b60
    }
Packit fd8b60
    if (info->info_dirs[0] == (char *)NULL) {
Packit fd8b60
        ss_perror(sci_idx, SS_ET_NO_INFO_DIR, (char *)NULL);
Packit fd8b60
        return;
Packit fd8b60
    }
Packit fd8b60
    for (idx = 0; info->info_dirs[idx] != (char *)NULL; idx++) {
Packit fd8b60
        (void) strncpy(buffer, info->info_dirs[idx], sizeof(buffer) - 1);
Packit fd8b60
        buffer[sizeof(buffer) - 1] = '\0';
Packit fd8b60
        (void) strncat(buffer, "/", sizeof(buffer) - 1 - strlen(buffer));
Packit fd8b60
        (void) strncat(buffer, argv[1], sizeof(buffer) - 1 - strlen(buffer));
Packit fd8b60
        (void) strncat(buffer, ".info", sizeof(buffer) - 1 - strlen(buffer));
Packit fd8b60
        if ((fd = open(&buffer[0], O_RDONLY)) >= 0) goto got_it;
Packit fd8b60
    }
Packit fd8b60
    if ((fd = open(&buffer[0], O_RDONLY)) < 0) {
Packit fd8b60
        char buf[MAXPATHLEN];
Packit fd8b60
        strncpy(buf, "No info found for ", sizeof(buf) - 1);
Packit fd8b60
        buf[sizeof(buf) - 1] = '\0';
Packit fd8b60
        strncat(buf, argv[1], sizeof(buf) - 1 - strlen(buf));
Packit fd8b60
        ss_perror(sci_idx, 0, buf);
Packit fd8b60
        return;
Packit fd8b60
    }
Packit fd8b60
got_it:
Packit fd8b60
    switch (child = fork()) {
Packit fd8b60
    case -1:
Packit fd8b60
        ss_perror(sci_idx, errno, "Can't fork for pager");
Packit fd8b60
        close(fd);
Packit fd8b60
        return;
Packit fd8b60
    case 0:
Packit fd8b60
        (void) dup2(fd, 0); /* put file on stdin */
Packit fd8b60
        ss_page_stdin();
Packit fd8b60
    default:
Packit fd8b60
        (void) close(fd); /* what can we do if it fails? */
Packit fd8b60
#ifdef WAIT_USES_INT
Packit fd8b60
        while (wait((int *)NULL) != child) {
Packit fd8b60
#else
Packit fd8b60
            while (wait((union wait *)NULL) != child) {
Packit fd8b60
#endif
Packit fd8b60
                /* do nothing if wrong pid */
Packit fd8b60
            };
Packit fd8b60
        }
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
#ifndef USE_DIRENT_H
Packit fd8b60
#include <sys/dir.h>
Packit fd8b60
#else
Packit fd8b60
#include <dirent.h>
Packit fd8b60
#endif
Packit fd8b60
Packit fd8b60
    void ss_add_info_dir(sci_idx, info_dir, code_ptr)
Packit fd8b60
        int sci_idx;
Packit fd8b60
    char *info_dir;
Packit fd8b60
    int *code_ptr;
Packit fd8b60
    {
Packit fd8b60
        ss_data *info;
Packit fd8b60
        DIR *d;
Packit fd8b60
        int n_dirs;
Packit fd8b60
        char **dirs;
Packit fd8b60
Packit fd8b60
        info = ss_info(sci_idx);
Packit fd8b60
        if ((info_dir == NULL) || (*info_dir == '\0')) {
Packit fd8b60
            *code_ptr = SS_ET_NO_INFO_DIR;
Packit fd8b60
            return;
Packit fd8b60
        }
Packit fd8b60
        if ((d = opendir(info_dir)) == (DIR *)NULL) {
Packit fd8b60
            *code_ptr = errno;
Packit fd8b60
            return;
Packit fd8b60
        }
Packit fd8b60
        closedir(d);
Packit fd8b60
        dirs = info->info_dirs;
Packit fd8b60
        for (n_dirs = 0; dirs[n_dirs] != (char *)NULL; n_dirs++)
Packit fd8b60
            ;               /* get number of non-NULL dir entries */
Packit fd8b60
        dirs = (char **)realloc((char *)dirs,
Packit fd8b60
                                (unsigned)(n_dirs + 2)*sizeof(char *));
Packit fd8b60
        if (dirs == (char **)NULL) {
Packit fd8b60
            info->info_dirs = (char **)NULL;
Packit fd8b60
            *code_ptr = errno;
Packit fd8b60
            return;
Packit fd8b60
        }
Packit fd8b60
        info->info_dirs = dirs;
Packit fd8b60
        dirs[n_dirs + 1] = (char *)NULL;
Packit fd8b60
        dirs[n_dirs] = strdup(info_dir);
Packit fd8b60
        *code_ptr = 0;
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    void ss_delete_info_dir(sci_idx, info_dir, code_ptr)
Packit fd8b60
        int sci_idx;
Packit fd8b60
    char *info_dir;
Packit fd8b60
    int *code_ptr;
Packit fd8b60
    {
Packit fd8b60
        char **i_d;
Packit fd8b60
        char **info_dirs;
Packit fd8b60
Packit fd8b60
        info_dirs = ss_info(sci_idx)->info_dirs;
Packit fd8b60
        for (i_d = info_dirs; *i_d; i_d++) {
Packit fd8b60
            if (!strcmp(*i_d, info_dir)) {
Packit fd8b60
                while (*i_d) {
Packit fd8b60
                    *i_d = *(i_d+1);
Packit fd8b60
                    i_d++;
Packit fd8b60
                }
Packit fd8b60
                *code_ptr = 0;
Packit fd8b60
                return;
Packit fd8b60
            }
Packit fd8b60
        }
Packit fd8b60
        *code_ptr = SS_ET_NO_INFO_DIR;
Packit fd8b60
    }