home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tcl2-73c.zip / tcl7.3 / tclUnixStr.c < prev    next >
C/C++ Source or Header  |  1993-09-09  |  16KB  |  736 lines

  1. /* 
  2.  * tclUnixStr.c --
  3.  *
  4.  *    This file contains procedures that generate strings
  5.  *    corresponding to various UNIX-related codes, such
  6.  *    as errno and signals.
  7.  *
  8.  * Copyright (c) 1991-1993 The Regents of the University of California.
  9.  * All rights reserved.
  10.  *
  11.  * Permission is hereby granted, without written agreement and without
  12.  * license or royalty fees, to use, copy, modify, and distribute this
  13.  * software and its documentation for any purpose, provided that the
  14.  * above copyright notice and the following two paragraphs appear in
  15.  * all copies of this software.
  16.  * 
  17.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  18.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  19.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  20.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  21.  *
  22.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  23.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  24.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  25.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  26.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  27.  */
  28.  
  29. #ifndef lint
  30. static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclUnixStr.c,v 1.17 93/09/09 14:47:55 ouster Exp $ SPRITE (Berkeley)";
  31. #endif /* not lint */
  32.  
  33. #include "tclInt.h"
  34. #include "tclUnix.h"
  35.  
  36. /*
  37.  *----------------------------------------------------------------------
  38.  *
  39.  * Tcl_ErrnoId --
  40.  *
  41.  *    Return a textual identifier for the current errno value.
  42.  *
  43.  * Results:
  44.  *    This procedure returns a machine-readable textual identifier
  45.  *    that corresponds to the current errno value (e.g. "EPERM").
  46.  *    The identifier is the same as the #define name in errno.h.
  47.  *
  48.  * Side effects:
  49.  *    None.
  50.  *
  51.  *----------------------------------------------------------------------
  52.  */
  53.  
  54. char *
  55. Tcl_ErrnoId()
  56. {
  57.     switch (errno) {
  58. #ifdef E2BIG
  59.     case E2BIG: return "E2BIG";
  60. #endif
  61. #ifdef EACCES
  62.     case EACCES: return "EACCES";
  63. #endif
  64. #ifdef EADDRINUSE
  65.     case EADDRINUSE: return "EADDRINUSE";
  66. #endif
  67. #ifdef EADDRNOTAVAIL
  68.     case EADDRNOTAVAIL: return "EADDRNOTAVAIL";
  69. #endif
  70. #ifdef EADV
  71.     case EADV: return "EADV";
  72. #endif
  73. #ifdef EAFNOSUPPORT
  74.     case EAFNOSUPPORT: return "EAFNOSUPPORT";
  75. #endif
  76. #ifdef EAGAIN
  77.     case EAGAIN: return "EAGAIN";
  78. #endif
  79. #ifdef EALIGN
  80.     case EALIGN: return "EALIGN";
  81. #endif
  82. #ifdef EALREADY
  83.     case EALREADY: return "EALREADY";
  84. #endif
  85. #ifdef EBADE
  86.     case EBADE: return "EBADE";
  87. #endif
  88. #ifdef EBADF
  89.     case EBADF: return "EBADF";
  90. #endif
  91. #ifdef EBADFD
  92.     case EBADFD: return "EBADFD";
  93. #endif
  94. #ifdef EBADMSG
  95.     case EBADMSG: return "EBADMSG";
  96. #endif
  97. #ifdef EBADR
  98.     case EBADR: return "EBADR";
  99. #endif
  100. #ifdef EBADRPC
  101.     case EBADRPC: return "EBADRPC";
  102. #endif
  103. #ifdef EBADRQC
  104.     case EBADRQC: return "EBADRQC";
  105. #endif
  106. #ifdef EBADSLT
  107.     case EBADSLT: return "EBADSLT";
  108. #endif
  109. #ifdef EBFONT
  110.     case EBFONT: return "EBFONT";
  111. #endif
  112. #ifdef EBUSY
  113.     case EBUSY: return "EBUSY";
  114. #endif
  115. #ifdef ECHILD
  116.     case ECHILD: return "ECHILD";
  117. #endif
  118. #ifdef ECHRNG
  119.     case ECHRNG: return "ECHRNG";
  120. #endif
  121. #ifdef ECOMM
  122.     case ECOMM: return "ECOMM";
  123. #endif
  124. #ifdef ECONNABORTED
  125.     case ECONNABORTED: return "ECONNABORTED";
  126. #endif
  127. #ifdef ECONNREFUSED
  128.     case ECONNREFUSED: return "ECONNREFUSED";
  129. #endif
  130. #ifdef ECONNRESET
  131.     case ECONNRESET: return "ECONNRESET";
  132. #endif
  133. #if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
  134.     case EDEADLK: return "EDEADLK";
  135. #endif
  136. #ifdef EDEADLOCK
  137.     case EDEADLOCK: return "EDEADLOCK";
  138. #endif
  139. #ifdef EDESTADDRREQ
  140.     case EDESTADDRREQ: return "EDESTADDRREQ";
  141. #endif
  142. #ifdef EDIRTY
  143.     case EDIRTY: return "EDIRTY";
  144. #endif
  145. #ifdef EDOM
  146.     case EDOM: return "EDOM";
  147. #endif
  148. #ifdef EDOTDOT
  149.     case EDOTDOT: return "EDOTDOT";
  150. #endif
  151. #ifdef EDQUOT
  152.     case EDQUOT: return "EDQUOT";
  153. #endif
  154. #ifdef EDUPPKG
  155.     case EDUPPKG: return "EDUPPKG";
  156. #endif
  157. #ifdef EEXIST
  158.     case EEXIST: return "EEXIST";
  159. #endif
  160. #ifdef EFAULT
  161.     case EFAULT: return "EFAULT";
  162. #endif
  163. #ifdef EFBIG
  164.     case EFBIG: return "EFBIG";
  165. #endif
  166. #ifdef EHOSTDOWN
  167.     case EHOSTDOWN: return "EHOSTDOWN";
  168. #endif
  169. #ifdef EHOSTUNREACH
  170.     case EHOSTUNREACH: return "EHOSTUNREACH";
  171. #endif
  172. #ifdef EIDRM
  173.     case EIDRM: return "EIDRM";
  174. #endif
  175. #ifdef EINIT
  176.     case EINIT: return "EINIT";
  177. #endif
  178. #ifdef EINPROGRESS
  179.     case EINPROGRESS: return "EINPROGRESS";
  180. #endif
  181. #ifdef EINTR
  182.     case EINTR: return "EINTR";
  183. #endif
  184. #ifdef EINVAL
  185.     case EINVAL: return "EINVAL";
  186. #endif
  187. #ifdef EIO
  188.     case EIO: return "EIO";
  189. #endif
  190. #ifdef EISCONN
  191.     case EISCONN: return "EISCONN";
  192. #endif
  193. #ifdef EISDIR
  194.     case EISDIR: return "EISDIR";
  195. #endif
  196. #ifdef EISNAME
  197.     case EISNAM: return "EISNAM";
  198. #endif
  199. #ifdef ELBIN
  200.     case ELBIN: return "ELBIN";
  201. #endif
  202. #ifdef EL2HLT
  203.     case EL2HLT: return "EL2HLT";
  204. #endif
  205. #ifdef EL2NSYNC
  206.     case EL2NSYNC: return "EL2NSYNC";
  207. #endif
  208. #ifdef EL3HLT
  209.     case EL3HLT: return "EL3HLT";
  210. #endif
  211. #ifdef EL3RST
  212.     case EL3RST: return "EL3RST";
  213. #endif
  214. #ifdef ELIBACC
  215.     case ELIBACC: return "ELIBACC";
  216. #endif
  217. #ifdef ELIBBAD
  218.     case ELIBBAD: return "ELIBBAD";
  219. #endif
  220. #ifdef ELIBEXEC
  221.     case ELIBEXEC: return "ELIBEXEC";
  222. #endif
  223. #ifdef ELIBMAX
  224.     case ELIBMAX: return "ELIBMAX";
  225. #endif
  226. #ifdef ELIBSCN
  227.     case ELIBSCN: return "ELIBSCN";
  228. #endif
  229. #ifdef ELNRNG
  230.     case ELNRNG: return "ELNRNG";
  231. #endif
  232. #ifdef ELOOP
  233.     case ELOOP: return "ELOOP";
  234. #endif
  235. #ifdef EMFILE
  236.     case EMFILE: return "EMFILE";
  237. #endif
  238. #ifdef EMLINK
  239.     case EMLINK: return "EMLINK";
  240. #endif
  241. #ifdef EMSGSIZE
  242.     case EMSGSIZE: return "EMSGSIZE";
  243. #endif
  244. #ifdef EMULTIHOP
  245.     case EMULTIHOP: return "EMULTIHOP";
  246. #endif
  247. #ifdef ENAMETOOLONG
  248.     case ENAMETOOLONG: return "ENAMETOOLONG";
  249. #endif
  250. #ifdef ENAVAIL
  251.     case ENAVAIL: return "ENAVAIL";
  252. #endif
  253. #ifdef ENET
  254.     case ENET: return "ENET";
  255. #endif
  256. #ifdef ENETDOWN
  257.     case ENETDOWN: return "ENETDOWN";
  258. #endif
  259. #ifdef ENETRESET
  260.     case ENETRESET: return "ENETRESET";
  261. #endif
  262. #ifdef ENETUNREACH
  263.     case ENETUNREACH: return "ENETUNREACH";
  264. #endif
  265. #ifdef ENFILE
  266.     case ENFILE: return "ENFILE";
  267. #endif
  268. #ifdef ENOANO
  269.     case ENOANO: return "ENOANO";
  270. #endif
  271. #if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
  272.     case ENOBUFS: return "ENOBUFS";
  273. #endif
  274. #ifdef ENOCSI
  275.     case ENOCSI: return "ENOCSI";
  276. #endif
  277. #ifdef ENODATA
  278.     case ENODATA: return "ENODATA";
  279. #endif
  280. #ifdef ENODEV
  281.     case ENODEV: return "ENODEV";
  282. #endif
  283. #ifdef ENOENT
  284.     case ENOENT: return "ENOENT";
  285. #endif
  286. #ifdef ENOEXEC
  287.     case ENOEXEC: return "ENOEXEC";
  288. #endif
  289. #ifdef ENOLCK
  290.     case ENOLCK: return "ENOLCK";
  291. #endif
  292. #ifdef ENOLINK
  293.     case ENOLINK: return "ENOLINK";
  294. #endif
  295. #ifdef ENOMEM
  296.     case ENOMEM: return "ENOMEM";
  297. #endif
  298. #ifdef ENOMSG
  299.     case ENOMSG: return "ENOMSG";
  300. #endif
  301. #ifdef ENONET
  302.     case ENONET: return "ENONET";
  303. #endif
  304. #ifdef ENOPKG
  305.     case ENOPKG: return "ENOPKG";
  306. #endif
  307. #ifdef ENOPROTOOPT
  308.     case ENOPROTOOPT: return "ENOPROTOOPT";
  309. #endif
  310. #ifdef ENOSPC
  311.     case ENOSPC: return "ENOSPC";
  312. #endif
  313. #ifdef ENOSR
  314.     case ENOSR: return "ENOSR";
  315. #endif
  316. #if defined(ENOSTR) && (!defined(ENOTTY) || (ENOTTY != ENOSTR))
  317.     case ENOSTR: return "ENOSTR";
  318. #endif
  319. #ifdef ENOSYM
  320.     case ENOSYM: return "ENOSYM";
  321. #endif
  322. #ifdef ENOSYS
  323.     case ENOSYS: return "ENOSYS";
  324. #endif
  325. #ifdef ENOTBLK
  326.     case ENOTBLK: return "ENOTBLK";
  327. #endif
  328. #ifdef ENOTCONN
  329.     case ENOTCONN: return "ENOTCONN";
  330. #endif
  331. #ifdef ENOTDIR
  332.     case ENOTDIR: return "ENOTDIR";
  333. #endif
  334. #if defined(ENOTEMPTY) && (!defined(EEXIST) || (ENOTEMPTY != EEXIST))
  335.     case ENOTEMPTY: return "ENOTEMPTY";
  336. #endif
  337. #ifdef ENOTNAM
  338.     case ENOTNAM: return "ENOTNAM";
  339. #endif
  340. #ifdef ENOTSOCK
  341.     case ENOTSOCK: return "ENOTSOCK";
  342. #endif
  343. #ifdef ENOTTY
  344.     case ENOTTY: return "ENOTTY";
  345. #endif
  346. #ifdef ENOTUNIQ
  347.     case ENOTUNIQ: return "ENOTUNIQ";
  348. #endif
  349. #ifdef ENXIO
  350.     case ENXIO: return "ENXIO";
  351. #endif
  352. #ifdef EOPNOTSUPP
  353.     case EOPNOTSUPP: return "EOPNOTSUPP";
  354. #endif
  355. #ifdef EPERM
  356.     case EPERM: return "EPERM";
  357. #endif
  358. #ifdef EPFNOSUPPORT
  359.     case EPFNOSUPPORT: return "EPFNOSUPPORT";
  360. #endif
  361. #ifdef EPIPE
  362.     case EPIPE: return "EPIPE";
  363. #endif
  364. #ifdef EPROCLIM
  365.     case EPROCLIM: return "EPROCLIM";
  366. #endif
  367. #ifdef EPROCUNAVAIL
  368.     case EPROCUNAVAIL: return "EPROCUNAVAIL";
  369. #endif
  370. #ifdef EPROGMISMATCH
  371.     case EPROGMISMATCH: return "EPROGMISMATCH";
  372. #endif
  373. #ifdef EPROGUNAVAIL
  374.     case EPROGUNAVAIL: return "EPROGUNAVAIL";
  375. #endif
  376. #ifdef EPROTO
  377.     case EPROTO: return "EPROTO";
  378. #endif
  379. #ifdef EPROTONOSUPPORT
  380.     case EPROTONOSUPPORT: return "EPROTONOSUPPORT";
  381. #endif
  382. #ifdef EPROTOTYPE
  383.     case EPROTOTYPE: return "EPROTOTYPE";
  384. #endif
  385. #ifdef ERANGE
  386.     case ERANGE: return "ERANGE";
  387. #endif
  388. #if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
  389.     case EREFUSED: return "EREFUSED";
  390. #endif
  391. #ifdef EREMCHG
  392.     case EREMCHG: return "EREMCHG";
  393. #endif
  394. #ifdef EREMDEV
  395.     case EREMDEV: return "EREMDEV";
  396. #endif
  397. #ifdef EREMOTE
  398.     case EREMOTE: return "EREMOTE";
  399. #endif
  400. #ifdef EREMOTEIO
  401.     case EREMOTEIO: return "EREMOTEIO";
  402. #endif
  403. #ifdef EREMOTERELEASE
  404.     case EREMOTERELEASE: return "EREMOTERELEASE";
  405. #endif
  406. #ifdef EROFS
  407.     case EROFS: return "EROFS";
  408. #endif
  409. #ifdef ERPCMISMATCH
  410.     case ERPCMISMATCH: return "ERPCMISMATCH";
  411. #endif
  412. #ifdef ERREMOTE
  413.     case ERREMOTE: return "ERREMOTE";
  414. #endif
  415. #ifdef ESHUTDOWN
  416.     case ESHUTDOWN: return "ESHUTDOWN";
  417. #endif
  418. #ifdef ESOCKTNOSUPPORT
  419.     case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
  420. #endif
  421. #ifdef ESPIPE
  422.     case ESPIPE: return "ESPIPE";
  423. #endif
  424. #ifdef ESRCH
  425.     case ESRCH: return "ESRCH";
  426. #endif
  427. #ifdef ESRMNT
  428.     case ESRMNT: return "ESRMNT";
  429. #endif
  430. #ifdef ESTALE
  431.     case ESTALE: return "ESTALE";
  432. #endif
  433. #ifdef ESUCCESS
  434.     case ESUCCESS: return "ESUCCESS";
  435. #endif
  436. #ifdef ETIME
  437.     case ETIME: return "ETIME";
  438. #endif
  439. #ifdef ETIMEDOUT
  440.     case ETIMEDOUT: return "ETIMEDOUT";
  441. #endif
  442. #ifdef ETOOMANYREFS
  443.     case ETOOMANYREFS: return "ETOOMANYREFS";
  444. #endif
  445. #ifdef ETXTBSY
  446.     case ETXTBSY: return "ETXTBSY";
  447. #endif
  448. #ifdef EUCLEAN
  449.     case EUCLEAN: return "EUCLEAN";
  450. #endif
  451. #ifdef EUNATCH
  452.     case EUNATCH: return "EUNATCH";
  453. #endif
  454. #ifdef EUSERS
  455.     case EUSERS: return "EUSERS";
  456. #endif
  457. #ifdef EVERSION
  458.     case EVERSION: return "EVERSION";
  459. #endif
  460. #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
  461.     case EWOULDBLOCK: return "EWOULDBLOCK";
  462. #endif
  463. #ifdef EXDEV
  464.     case EXDEV: return "EXDEV";
  465. #endif
  466. #ifdef EXFULL
  467.     case EXFULL: return "EXFULL";
  468. #endif
  469.     }
  470.     return "unknown error";
  471. }
  472.  
  473. /*
  474.  *----------------------------------------------------------------------
  475.  *
  476.  * Tcl_SignalId --
  477.  *
  478.  *    Return a textual identifier for a signal number.
  479.  *
  480.  * Results:
  481.  *    This procedure returns a machine-readable textual identifier
  482.  *    that corresponds to sig.  The identifier is the same as the
  483.  *    #define name in signal.h.
  484.  *
  485.  * Side effects:
  486.  *    None.
  487.  *
  488.  *----------------------------------------------------------------------
  489.  */
  490.  
  491. char *
  492. Tcl_SignalId(sig)
  493.     int sig;            /* Number of signal. */
  494. {
  495.     switch (sig) {
  496. #ifdef SIGABRT
  497.     case SIGABRT: return "SIGABRT";
  498. #endif
  499. #ifdef SIGALRM
  500.     case SIGALRM: return "SIGALRM";
  501. #endif
  502. #ifdef SIGBUS
  503.     case SIGBUS: return "SIGBUS";
  504. #endif
  505. #ifdef SIGCHLD
  506.     case SIGCHLD: return "SIGCHLD";
  507. #endif
  508. #if defined(SIGCLD) && (!defined(SIGCHLD) || (SIGCLD != SIGCHLD))
  509.     case SIGCLD: return "SIGCLD";
  510. #endif
  511. #ifdef SIGCONT
  512.     case SIGCONT: return "SIGCONT";
  513. #endif
  514. #if defined(SIGEMT) && (!defined(SIGXCPU) || (SIGEMT != SIGXCPU))
  515.     case SIGEMT: return "SIGEMT";
  516. #endif
  517. #ifdef SIGFPE
  518.     case SIGFPE: return "SIGFPE";
  519. #endif
  520. #ifdef SIGHUP
  521.     case SIGHUP: return "SIGHUP";
  522. #endif
  523. #ifdef SIGILL
  524.     case SIGILL: return "SIGILL";
  525. #endif
  526. #ifdef SIGINT
  527.     case SIGINT: return "SIGINT";
  528. #endif
  529. #ifdef SIGIO
  530.     case SIGIO: return "SIGIO";
  531. #endif
  532. #if defined(SIGIOT) && (!defined(SIGABRT) || (SIGIOT != SIGABRT))
  533.     case SIGIOT: return "SIGIOT";
  534. #endif
  535. #ifdef SIGKILL
  536.     case SIGKILL: return "SIGKILL";
  537. #endif
  538. #if defined(SIGLOST) && (!defined(SIGIOT) || (SIGLOST != SIGIOT)) && (!defined(SIGURG) || (SIGLOST != SIGURG))
  539.     case SIGLOST: return "SIGLOST";
  540. #endif
  541. #ifdef SIGPIPE
  542.     case SIGPIPE: return "SIGPIPE";
  543. #endif
  544. #if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
  545.     case SIGPOLL: return "SIGPOLL";
  546. #endif
  547. #ifdef SIGPROF
  548.     case SIGPROF: return "SIGPROF";
  549. #endif
  550. #if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
  551.     case SIGPWR: return "SIGPWR";
  552. #endif
  553. #ifdef SIGQUIT
  554.     case SIGQUIT: return "SIGQUIT";
  555. #endif
  556. #ifdef SIGSEGV
  557.     case SIGSEGV: return "SIGSEGV";
  558. #endif
  559. #ifdef SIGSTOP
  560.     case SIGSTOP: return "SIGSTOP";
  561. #endif
  562. #ifdef SIGSYS
  563.     case SIGSYS: return "SIGSYS";
  564. #endif
  565. #ifdef SIGTERM
  566.     case SIGTERM: return "SIGTERM";
  567. #endif
  568. #ifdef SIGTRAP
  569.     case SIGTRAP: return "SIGTRAP";
  570. #endif
  571. #ifdef SIGTSTP
  572.     case SIGTSTP: return "SIGTSTP";
  573. #endif
  574. #ifdef SIGTTIN
  575.     case SIGTTIN: return "SIGTTIN";
  576. #endif
  577. #ifdef SIGTTOU
  578.     case SIGTTOU: return "SIGTTOU";
  579. #endif
  580. #if defined(SIGURG) && (!defined(SIGIO) || (SIGURG != SIGIO))
  581.     case SIGURG: return "SIGURG";
  582. #endif
  583. #if defined(SIGUSR1) && (!defined(SIGIO) || (SIGUSR1 != SIGIO))
  584.     case SIGUSR1: return "SIGUSR1";
  585. #endif
  586. #if defined(SIGUSR2) && (!defined(SIGURG) || (SIGUSR2 != SIGURG))
  587.     case SIGUSR2: return "SIGUSR2";
  588. #endif
  589. #ifdef SIGVTALRM
  590.     case SIGVTALRM: return "SIGVTALRM";
  591. #endif
  592. #ifdef SIGWINCH
  593.     case SIGWINCH: return "SIGWINCH";
  594. #endif
  595. #ifdef SIGXCPU
  596.     case SIGXCPU: return "SIGXCPU";
  597. #endif
  598. #ifdef SIGXFSZ
  599.     case SIGXFSZ: return "SIGXFSZ";
  600. #endif
  601.     }
  602.     return "unknown signal";
  603. }
  604.  
  605. /*
  606.  *----------------------------------------------------------------------
  607.  *
  608.  * Tcl_SignalMsg --
  609.  *
  610.  *    Return a human-readable message describing a signal.
  611.  *
  612.  * Results:
  613.  *    This procedure returns a string describing sig that should
  614.  *    make sense to a human.  It may not be easy for a machine
  615.  *    to parse.
  616.  *
  617.  * Side effects:
  618.  *    None.
  619.  *
  620.  *----------------------------------------------------------------------
  621.  */
  622.  
  623. char *
  624. Tcl_SignalMsg(sig)
  625.     int sig;            /* Number of signal. */
  626. {
  627.     switch (sig) {
  628. #ifdef SIGABRT
  629.     case SIGABRT: return "SIGABRT";
  630. #endif
  631. #ifdef SIGALRM
  632.     case SIGALRM: return "alarm clock";
  633. #endif
  634. #ifdef SIGBUS
  635.     case SIGBUS: return "bus error";
  636. #endif
  637. #ifdef SIGCHLD
  638.     case SIGCHLD: return "child status changed";
  639. #endif
  640. #if defined(SIGCLD) && (!defined(SIGCHLD) || (SIGCLD != SIGCHLD))
  641.     case SIGCLD: return "child status changed";
  642. #endif
  643. #ifdef SIGCONT
  644.     case SIGCONT: return "continue after stop";
  645. #endif
  646. #if defined(SIGEMT) && (!defined(SIGXCPU) || (SIGEMT != SIGXCPU))
  647.     case SIGEMT: return "EMT instruction";
  648. #endif
  649. #ifdef SIGFPE
  650.     case SIGFPE: return "floating-point exception";
  651. #endif
  652. #ifdef SIGHUP
  653.     case SIGHUP: return "hangup";
  654. #endif
  655. #ifdef SIGILL
  656.     case SIGILL: return "illegal instruction";
  657. #endif
  658. #ifdef SIGINT
  659.     case SIGINT: return "interrupt";
  660. #endif
  661. #ifdef SIGIO
  662.     case SIGIO: return "input/output possible on file";
  663. #endif
  664. #if defined(SIGIOT) && (!defined(SIGABRT) || (SIGABRT != SIGIOT))
  665.     case SIGIOT: return "IOT instruction";
  666. #endif
  667. #ifdef SIGKILL
  668.     case SIGKILL: return "kill signal";
  669. #endif
  670. #if defined(SIGLOST) && (!defined(SIGIOT) || (SIGLOST != SIGIOT)) && (!defined(SIGURG) || (SIGLOST != SIGURG))
  671.     case SIGLOST: return "resource lost";
  672. #endif
  673. #ifdef SIGPIPE
  674.     case SIGPIPE: return "write on pipe with no readers";
  675. #endif
  676. #if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
  677.     case SIGPOLL: return "input/output possible on file";
  678. #endif
  679. #ifdef SIGPROF
  680.     case SIGPROF: return "profiling alarm";
  681. #endif
  682. #if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
  683.     case SIGPWR: return "power-fail restart";
  684. #endif
  685. #ifdef SIGQUIT
  686.     case SIGQUIT: return "quit signal";
  687. #endif
  688. #ifdef SIGSEGV
  689.     case SIGSEGV: return "segmentation violation";
  690. #endif
  691. #ifdef SIGSTOP
  692.     case SIGSTOP: return "stop";
  693. #endif
  694. #ifdef SIGSYS
  695.     case SIGSYS: return "bad argument to system call";
  696. #endif
  697. #ifdef SIGTERM
  698.     case SIGTERM: return "software termination signal";
  699. #endif
  700. #ifdef SIGTRAP
  701.     case SIGTRAP: return "trace trap";
  702. #endif
  703. #ifdef SIGTSTP
  704.     case SIGTSTP: return "stop signal from tty";
  705. #endif
  706. #ifdef SIGTTIN
  707.     case SIGTTIN: return "background tty read";
  708. #endif
  709. #ifdef SIGTTOU
  710.     case SIGTTOU: return "background tty write";
  711. #endif
  712. #if defined(SIGURG) && (!defined(SIGIO) || (SIGURG != SIGIO))
  713.     case SIGURG: return "urgent I/O condition";
  714. #endif
  715. #if defined(SIGUSR1) && (!defined(SIGIO) || (SIGUSR1 != SIGIO))
  716.     case SIGUSR1: return "user-defined signal 1";
  717. #endif
  718. #if defined(SIGUSR2) && (!defined(SIGURG) || (SIGUSR2 != SIGURG))
  719.     case SIGUSR2: return "user-defined signal 2";
  720. #endif
  721. #ifdef SIGVTALRM
  722.     case SIGVTALRM: return "virtual time alarm";
  723. #endif
  724. #ifdef SIGWINCH
  725.     case SIGWINCH: return "window changed";
  726. #endif
  727. #ifdef SIGXCPU
  728.     case SIGXCPU: return "exceeded CPU time limit";
  729. #endif
  730. #ifdef SIGXFSZ
  731.     case SIGXFSZ: return "exceeded file size limit";
  732. #endif
  733.     }
  734.     return "unknown signal";
  735. }
  736.