Ignore:
Timestamp:
Oct 7, 2007, 9:13:10 PM (18 years ago)
Author:
bird
Message:

kill.c ++

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/bltin/kill.c

    r1207 r1213  
    4747
    4848#include <ctype.h>
    49 #ifndef __sun__
    50 #include <err.h>
    51 #endif
    5249#include <errno.h>
    53 #include <signal.h>
    5450#include <stdio.h>
    5551#include <stdlib.h>
    5652#include <string.h>
    57 #include <termios.h>
    58 #include <unistd.h>
    59 #include <locale.h>
    60 #include <sys/ioctl.h>
     53#include "jobs.h"
     54#include "error.h"
     55#include "shinstance.h"
    6156
    6257#ifndef HAVE_SYS_SIGNAME
     
    6560#endif
    6661
    67 #ifdef SHELL            /* sh (aka ash) builtin */
    68 #define main killcmd
    69 #include "bltin/bltin.h"
    70 #include "jobs.h"
    71 #endif /* SHELL */
    72 
    73 static void nosig(char *);
    74 static void printsignals(FILE *);
     62static int nosig(shinstance *, char *);
     63static void printsignals(shinstance *, struct output *);
    7564static int signame_to_signum(char *);
    76 static void usage(void);
    77 int main(int, char *[]);
     65static int usage(shinstance *psh);
    7866
    7967int
    80 main(int argc, char *argv[])
     68killcmd(shinstance *psh, int argc, char *argv[])
    8169{
    8270        int errors, numsig, pid;
    8371        char *ep;
    8472
    85         setprogname(argv[0]);
    86         setlocale(LC_ALL, "");
    8773        if (argc < 2)
    88                 usage();
     74                return usage(psh);
    8975
    9076        numsig = SIGTERM;
     77#ifndef HAVE_SYS_SIGNAME
     78        init_sys_signame();
     79#endif
    9180
    9281        argc--, argv++;
     
    9483                argc--, argv++;
    9584                if (argc > 1)
    96                         usage();
     85                        return usage(psh);
    9786                if (argc == 1) {
    9887                        if (isdigit((unsigned char)**argv) == 0)
    99                                 usage();
     88                                return usage(psh);
    10089                        numsig = strtol(*argv, &ep, 10);
    10190                        if (*ep != '\0') {
    102                                 errx(EXIT_FAILURE, "illegal signal number: %s",
     91                                sh_errx(psh, EXIT_FAILURE, "illegal signal number: %s",
    10392                                                *argv);
    10493                                /* NOTREACHED */
     
    10796                                numsig -= 128;
    10897                        if (numsig <= 0 || numsig >= NSIG)
    109                                 nosig(*argv);
    110 #ifndef HAVE_SYS_SIGNAME
    111                         init_sys_signame();
    112 #endif
    113                         printf("%s\n", sys_signame[numsig]);
    114                         exit(0);
    115                 }
    116                 printsignals(stdout);
    117                 exit(0);
     98                                return nosig(psh, *argv);
     99                        outfmt(psh->out1, "%s\n", sys_signame[numsig]);
     100                        //sh_exit(psh, 0);
     101                        return 0;
     102                }
     103                printsignals(psh, psh->out1);
     104                //sh_exit(psh, 0);
     105                return 0;
    118106        }
    119107
     
    121109                argc--, argv++;
    122110                if (argc < 1) {
    123                         warnx("option requires an argument -- s");
    124                         usage();
     111                        sh_warnx(psh, "option requires an argument -- s");
     112                        return usage(psh);
    125113                }
    126114                if (strcmp(*argv, "0")) {
    127115                        if ((numsig = signame_to_signum(*argv)) < 0)
    128                                 nosig(*argv);
     116                                return nosig(psh, *argv);
    129117                } else
    130118                        numsig = 0;
     
    134122                if (isalpha((unsigned char)**argv)) {
    135123                        if ((numsig = signame_to_signum(*argv)) < 0)
    136                                 nosig(*argv);
     124                                return nosig(psh, *argv);
    137125                } else if (isdigit((unsigned char)**argv)) {
    138126                        numsig = strtol(*argv, &ep, 10);
    139127                        if (!*argv || *ep) {
    140                                 errx(EXIT_FAILURE, "illegal signal number: %s",
     128                                sh_errx(psh, EXIT_FAILURE, "illegal signal number: %s",
    141129                                                *argv);
    142130                                /* NOTREACHED */
    143131                        }
    144132                        if (numsig < 0 || numsig >= NSIG)
    145                                 nosig(*argv);
     133                                return nosig(psh, *argv);
    146134                } else
    147                         nosig(*argv);
     135                        return nosig(psh, *argv);
    148136                argc--, argv++;
    149137        }
    150138
    151139        if (argc == 0)
    152                 usage();
     140                return usage(psh);
    153141
    154142        for (errors = 0; argc; argc--, argv++) {
    155 #ifdef SHELL
    156143                if (*argv[0] == '%') {
    157144                        pid = getjobpgrp(psh, *argv);
    158145                        if (pid == 0) {
    159                                 warnx("illegal job id: %s", *argv);
     146                                sh_warnx(psh, "illegal job id: %s", *argv);
    160147                                errors = 1;
    161148                                continue;
    162149                        }
    163                 } else
    164 #endif
    165                 {
     150                } else {
    166151                        pid = strtol(*argv, &ep, 10);
    167152                        if (!**argv || *ep) {
    168                                 warnx("illegal process id: %s", *argv);
     153                                sh_warnx(psh, "illegal process id: %s", *argv);
    169154                                errors = 1;
    170155                                continue;
    171156                        }
    172157                }
    173                 if (kill(pid, numsig) == -1) {
    174                         warn("%s", *argv);
     158                if (sh_kill(psh, pid, numsig) == -1) {
     159                        sh_warn(psh, "%s", *argv);
    175160                        errors = 1;
    176161                }
    177 #ifdef SHELL
    178162                /* Wakeup the process if it was suspended, so it can
    179163                   exit without an explicit 'fg'. */
    180164                if (numsig == SIGTERM || numsig == SIGHUP)
    181                         kill(pid, SIGCONT);
    182 #endif
    183         }
    184 
    185         exit(errors);
    186         /* NOTREACHED */
     165                        sh_kill(psh, pid, SIGCONT);
     166        }
     167
     168        //sh_exit(psh, errors);
     169        ///* NOTREACHED */
     170        return errors;
    187171}
    188172
     
    191175{
    192176        int n;
    193 #ifndef HAVE_SYS_SIGNAME
    194         init_sys_signame();
    195 #endif
    196177        if (strncasecmp(sig, "sig", 3) == 0)
    197178                sig += 3;
     
    203184}
    204185
     186static int
     187nosig(shinstance *psh, char *name)
     188{
     189        sh_warnx(psh, "unknown signal %s; valid signals:", name);
     190        printsignals(psh, psh->out2);
     191        //sh_exit(psh, 1);
     192        ///* NOTREACHED */
     193        return 1;
     194}
     195
    205196static void
    206 nosig(char *name)
    207 {
    208 
    209         warnx("unknown signal %s; valid signals:", name);
    210         printsignals(stderr);
    211         exit(1);
    212         /* NOTREACHED */
    213 }
    214 
    215 static void
    216 printsignals(FILE *fp)
     197printsignals(shinstance *psh, struct output *out)
    217198{
    218199        int sig;
    219         int len, nl;
     200        size_t len, nl;
    220201        const char *name;
    221202        int termwidth = 80;
    222203
    223 #ifdef TIOCGWINSZ
    224         if (isatty(fileno(fp))) {
    225                 struct winsize win;
    226                 if (ioctl(fileno(fp), TIOCGWINSZ, &win) == 0 && win.ws_col > 0)
     204        if (shfile_isatty(&psh->fdtab, out->fd)) {
     205                sh_winsize win;
     206                if (shfile_ioctl(&psh->fdtab, out->fd, TIOCGWINSZ, &win) == 0 && win.ws_col > 0)
    227207                        termwidth = win.ws_col;
    228208        }
    229 #else
    230 #ifndef _MSC_VER
    231 #warning TIOCGWINSZ is not present.
    232 #endif
    233 #endif
    234 #ifndef HAVE_SYS_SIGNAME
    235     init_sys_signame();
    236 #endif
    237209
    238210        for (len = 0, sig = 1; sig < NSIG; sig++) {
     
    241213
    242214                if (len + nl >= termwidth) {
    243                         fprintf(fp, "\n");
     215                        outfmt(out, "\n");
    244216                        len = 0;
    245                 } else
    246                         if (len != 0)
    247                                 fprintf(fp, " ");
     217                } else if (len != 0)
     218                        outfmt(out, " ");
    248219                len += nl;
    249                 fprintf(fp, "%s", name);
     220                outfmt(out, "%s", name);
    250221        }
    251222        if (len != 0)
    252                 fprintf(fp, "\n");
    253 }
    254 
    255 static void
    256 usage(void)
    257 {
    258 
    259         fprintf(stderr, "usage: %s [-s signal_name] pid ...\n"
     223                outfmt(out, "\n");
     224}
     225
     226static int
     227usage(shinstance *psh)
     228{
     229        outfmt(psh->out2,
     230            "usage: %s [-s signal_name] pid ...\n"
    260231            "       %s -l [exit_status]\n"
    261232            "       %s -signal_name pid ...\n"
    262233            "       %s -signal_number pid ...\n",
    263             getprogname(), getprogname(), getprogname(), getprogname());
    264         exit(1);
    265         /* NOTREACHED */
    266 }
     234            psh->commandname, psh->commandname, psh->commandname, psh->commandname);
     235        //sh_exit(psh, 1);
     236        ///* NOTREACHED */
     237        return 1;
     238}
Note: See TracChangeset for help on using the changeset viewer.