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