0000: 23 64 65 66 69 6e 65 20 5f 4c 49 4e 55 58 5f 53 #define _LINUX_S
0010: 4f 55 52 43 45 20 31 0a 23 69 6e 63 6c 75 64 65 OURCE 1.#include
0020: 20 3c 73 79 73 2f 73 79 73 63 61 6c 6c 2e 68 3e <sys/syscall.h>
0030: 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65 74 69 6e .#include <netin
0040: 65 74 2f 69 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 et/in.h>.#includ
0050: 65 20 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a e <arpa/inet.h>.
0060: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 6f #include <sys/so
0070: 63 6b 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 cket.h>.#include
0080: 20 3c 73 79 73 2f 73 65 6c 65 63 74 2e 68 3e 0a <sys/select.h>.
0090: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f #include <sys/mo
00a0: 75 6e 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 unt.h>.#include
00b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 <sys/types.h>.#i
00c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 nclude <sys/ioct
00d0: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 l.h>.#include <s
00e0: 79 73 2f 73 77 61 70 2e 68 3e 0a 23 69 6e 63 6c ys/swap.h>.#incl
00f0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e ude <sys/stat.h>
0100: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 77 .#include <sys/w
0110: 61 69 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 ait.h>.#include
0120: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c <stdlib.h>.#incl
0130: 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23 ude <signal.h>.#
0140: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e include <unistd.
0150: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 h>.#include <str
0160: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 ing.h>.#include
0170: 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 <fcntl.h>.#inclu
0180: 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e de <errno.h>.#in
0190: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 clude <time.h>.#
01a0: 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a include <tcl.h>.
01b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 69 6e 75 78 .#include <linux
01c0: 2f 73 6f 63 6b 69 6f 73 2e 68 3e 0a 23 69 6e 63 /sockios.h>.#inc
01d0: 6c 75 64 65 20 3c 6c 69 6e 75 78 2f 72 6f 75 74 lude <linux/rout
01e0: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c e.h>.#include <l
01f0: 69 6e 75 78 2f 69 66 2e 68 3e 0a 23 69 6e 63 6c inux/if.h>.#incl
0200: 75 64 65 20 3c 6c 69 6e 75 78 2f 69 66 5f 61 72 ude <linux/if_ar
0210: 70 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c p.h>.#include <l
0220: 69 6e 75 78 2f 69 66 5f 62 72 69 64 67 65 2e 68 inux/if_bridge.h
0230: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 69 6e 75 >.#include <linu
0240: 78 2f 6c 6f 6f 70 2e 68 3e 0a 23 69 6e 63 6c 75 x/loop.h>.#inclu
0250: 64 65 20 3c 6c 69 6e 75 78 2f 66 73 2e 68 3e 0a de <linux/fs.h>.
0260: 0a 23 69 66 6e 64 65 66 20 48 4f 53 54 5f 4e 41 .#ifndef HOST_NA
0270: 4d 45 5f 4d 41 58 0a 2f 2a 20 53 55 53 76 32 20 ME_MAX./* SUSv2
0280: 4c 69 6d 69 74 20 2a 2f 0a 23 64 65 66 69 6e 65 Limit */.#define
0290: 20 48 4f 53 54 5f 4e 41 4d 45 5f 4d 41 58 20 32 HOST_NAME_MAX 2
02a0: 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 72 55.#endif../* Fr
02b0: 6f 6d 20 4c 69 6e 75 78 20 32 2e 36 20 2a 2f 0a om Linux 2.6 */.
02c0: 23 69 66 6e 64 65 66 20 4d 4e 54 5f 44 45 54 41 #ifndef MNT_DETA
02d0: 43 48 0a 23 64 65 66 69 6e 65 20 4d 4e 54 5f 44 CH.#define MNT_D
02e0: 45 54 41 43 48 20 32 0a 23 65 6e 64 69 66 0a 23 ETACH 2.#endif.#
02f0: 69 66 6e 64 65 66 20 4d 4e 54 5f 45 58 50 49 52 ifndef MNT_EXPIR
0300: 45 0a 23 64 65 66 69 6e 65 20 4d 4e 54 5f 45 58 E.#define MNT_EX
0310: 50 49 52 45 20 34 0a 23 65 6e 64 69 66 0a 23 69 PIRE 4.#endif.#i
0320: 66 6e 64 65 66 20 4d 53 5f 4d 4f 56 45 0a 23 64 fndef MS_MOVE.#d
0330: 65 66 69 6e 65 20 4d 53 5f 4d 4f 56 45 20 38 31 efine MS_MOVE 81
0340: 39 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 69 92.#endif../* Si
0350: 6d 70 6c 65 20 6d 61 63 72 6f 73 20 2a 2f 0a 23 mple macros */.#
0360: 69 66 6e 64 65 66 20 4d 41 58 0a 23 64 65 66 69 ifndef MAX.#defi
0370: 6e 65 20 4d 41 58 28 61 2c 20 62 29 20 28 28 28 ne MAX(a, b) (((
0380: 61 29 20 3c 20 28 62 29 29 20 3f 20 28 62 29 20 a) < (b)) ? (b)
0390: 3a 20 28 61 29 29 0a 23 65 6e 64 69 66 0a 23 69 : (a)).#endif.#i
03a0: 66 6e 64 65 66 20 4d 49 4e 0a 23 64 65 66 69 6e fndef MIN.#defin
03b0: 65 20 4d 49 4e 28 61 2c 20 62 29 20 28 28 28 61 e MIN(a, b) (((a
03c0: 29 20 3c 20 28 62 29 29 20 3f 20 28 61 29 20 3a ) < (b)) ? (a) :
03d0: 20 28 62 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a (b)).#endif../*
03e0: 20 55 73 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e User environmen
03f0: 74 2c 20 66 6f 72 20 65 78 65 63 76 65 20 2a 2f t, for execve */
0400: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 2a 65 .extern char **e
0410: 6e 76 69 72 6f 6e 3b 0a 0a 2f 2a 20 52 65 2d 69 nviron;../* Re-i
0420: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 73 65 20 69 mplement these i
0430: 66 20 6e 65 65 64 65 64 20 2a 2f 0a 23 69 66 64 f needed */.#ifd
0440: 65 66 20 53 59 53 5f 69 6e 69 74 5f 6d 6f 64 75 ef SYS_init_modu
0450: 6c 65 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e le.static int in
0460: 69 74 5f 6d 6f 64 75 6c 65 28 76 6f 69 64 20 2a it_module(void *
0470: 76 61 6c 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f val, unsigned lo
0480: 6e 67 20 6c 65 6e 2c 20 63 6f 6e 73 74 20 63 68 ng len, const ch
0490: 61 72 20 2a 61 72 67 73 29 20 7b 0a 09 72 65 74 ar *args) {..ret
04a0: 75 72 6e 28 73 79 73 63 61 6c 6c 28 53 59 53 5f urn(syscall(SYS_
04b0: 69 6e 69 74 5f 6d 6f 64 75 6c 65 2c 20 76 61 6c init_module, val
04c0: 2c 20 6c 65 6e 2c 20 61 72 67 73 29 29 3b 0a 7d , len, args));.}
04d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 .#endif.#ifdef S
04e0: 59 53 5f 70 69 76 6f 74 5f 72 6f 6f 74 0a 73 74 YS_pivot_root.st
04f0: 61 74 69 63 20 69 6e 74 20 70 69 76 6f 74 5f 72 atic int pivot_r
0500: 6f 6f 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a oot(const char *
0510: 6e 65 77 5f 72 6f 6f 74 2c 20 63 6f 6e 73 74 20 new_root, const
0520: 63 68 61 72 20 2a 70 75 74 5f 6f 6c 64 29 20 7b char *put_old) {
0530: 0a 09 72 65 74 75 72 6e 28 73 79 73 63 61 6c 6c ..return(syscall
0540: 28 53 59 53 5f 70 69 76 6f 74 5f 72 6f 6f 74 2c (SYS_pivot_root,
0550: 20 6e 65 77 5f 72 6f 6f 74 2c 20 70 75 74 5f 6f new_root, put_o
0560: 6c 64 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a ld));.}.#endif..
0570: 2f 2a 0a 20 2a 20 53 69 6d 70 6c 65 20 68 61 73 /*. * Simple has
0580: 68 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 6e 61 h routine to ena
0590: 62 6c 65 20 73 77 69 74 63 68 69 6e 67 20 6f 6e ble switching on
05a0: 20 61 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 a string to be
05b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 20 2a 2f 0a implemented. */.
05c0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 static unsigned
05d0: 6c 6f 6e 67 20 74 63 6c 73 79 73 74 65 6d 5f 69 long tclsystem_i
05e0: 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68 61 nternal_simpleha
05f0: 73 68 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 64 sh(const void *d
0600: 61 74 61 62 75 66 2c 20 69 6e 74 20 64 61 74 61 atabuf, int data
0610: 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 len) {..unsigned
0620: 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 30 long retval = 0
0630: 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ;..const unsigne
0640: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 0a 09 d char *data;...
0650: 64 61 74 61 20 3d 20 64 61 74 61 62 75 66 3b 0a data = databuf;.
0660: 0a 09 66 6f 72 20 28 3b 20 64 61 74 61 6c 65 6e ..for (; datalen
0670: 20 3e 20 30 3b 20 64 61 74 61 6c 65 6e 2d 2d 2c > 0; datalen--,
0680: 64 61 74 61 2b 2b 29 20 7b 0a 09 09 72 65 74 76 data++) {...retv
0690: 61 6c 20 5e 3d 20 28 72 65 74 76 61 6c 20 3e 3e al ^= (retval >>
06a0: 20 32 35 29 20 26 20 30 78 37 46 3b 0a 09 09 72 25) & 0x7F;...r
06b0: 65 74 76 61 6c 20 3c 3c 3d 20 37 3b 0a 09 09 72 etval <<= 7;...r
06c0: 65 74 76 61 6c 20 26 3d 20 28 30 78 46 46 46 46 etval &= (0xFFFF
06d0: 46 46 46 46 55 4c 29 3b 0a 09 09 72 65 74 76 61 FFFFUL);...retva
06e0: 6c 20 5e 3d 20 2a 64 61 74 61 3b 0a 09 7d 0a 0a l ^= *data;..}..
06f0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b .return(retval);
0700: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 .}..static unsig
0710: 6e 65 64 20 6c 6f 6e 67 20 74 63 6c 73 79 73 74 ned long tclsyst
0720: 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 em_internal_simp
0730: 6c 65 68 61 73 68 5f 6f 62 6a 28 54 63 6c 5f 4f lehash_obj(Tcl_O
0740: 62 6a 20 2a 74 63 6c 5f 64 61 74 61 29 20 7b 0a bj *tcl_data) {.
0750: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 .unsigned long r
0760: 65 74 76 61 6c 3b 0a 09 63 68 61 72 20 2a 64 61 etval;..char *da
0770: 74 61 3b 0a 09 69 6e 74 20 64 61 74 61 6c 65 6e ta;..int datalen
0780: 20 3d 20 2d 31 3b 0a 0a 09 64 61 74 61 20 3d 20 = -1;...data =
0790: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
07a0: 6d 4f 62 6a 28 74 63 6c 5f 64 61 74 61 2c 20 26 mObj(tcl_data, &
07b0: 64 61 74 61 6c 65 6e 29 3b 0a 0a 09 72 65 74 76 datalen);...retv
07c0: 61 6c 20 3d 20 74 63 6c 73 79 73 74 65 6d 5f 69 al = tclsystem_i
07d0: 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68 61 nternal_simpleha
07e0: 73 68 28 64 61 74 61 2c 20 64 61 74 61 6c 65 6e sh(data, datalen
07f0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 );...return(retv
0800: 61 6c 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a al);.}..#if 0./*
0810: 20 4e 4f 54 55 53 45 44 3a 20 55 6e 63 6f 6d 6d NOTUSED: Uncomm
0820: 65 6e 74 20 77 68 65 6e 20 6e 65 65 64 65 64 3a ent when needed:
0830: 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 */.static unsig
0840: 6e 65 64 20 6c 6f 6e 67 20 74 63 6c 73 79 73 74 ned long tclsyst
0850: 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 em_internal_simp
0860: 6c 65 68 61 73 68 5f 73 74 72 28 63 6f 6e 73 74 lehash_str(const
0870: 20 63 68 61 72 20 2a 64 61 74 61 29 20 7b 0a 09 char *data) {..
0880: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 unsigned long re
0890: 74 76 61 6c 3b 0a 09 69 6e 74 20 64 61 74 61 6c tval;..int datal
08a0: 65 6e 3b 0a 0a 09 64 61 74 61 6c 65 6e 20 3d 20 en;...datalen =
08b0: 73 74 72 6c 65 6e 28 64 61 74 61 29 3b 0a 0a 09 strlen(data);...
08c0: 72 65 74 76 61 6c 20 3d 20 74 63 6c 73 79 73 74 retval = tclsyst
08d0: 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 em_internal_simp
08e0: 6c 65 68 61 73 68 28 64 61 74 61 2c 20 64 61 74 lehash(data, dat
08f0: 61 6c 65 6e 29 3b 0a 0a 09 72 65 74 75 72 6e 28 alen);...return(
0900: 72 65 74 76 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 retval);.}.#endi
0910: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 f..static int tc
0920: 6c 73 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c lsystem_internal
0930: 70 72 6f 63 5f 73 69 6d 70 6c 65 68 61 73 68 28 proc_simplehash(
0940: 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 ClientData cd, T
0950: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0960: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
0970: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj *CONST objv
0980: 5b 5d 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 []) {..unsigned
0990: 6c 6f 6e 67 20 68 61 73 68 76 61 6c 3b 0a 09 54 long hashval;..T
09a0: 63 6c 5f 4f 62 6a 20 2a 68 61 73 68 76 61 6c 5f cl_Obj *hashval_
09b0: 6f 62 6a 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 obj;...if (objc
09c0: 21 3d 20 32 29 20 7b 0a 09 09 54 63 6c 5f 53 65 != 2) {...Tcl_Se
09d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
09e0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
09f0: 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 Obj("wrong # arg
0a00: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a s: should be \":
0a10: 3a 73 79 73 74 65 6d 3a 3a 69 6e 74 65 72 6e 61 :system::interna
0a20: 6c 3a 3a 68 61 73 68 20 76 61 6c 75 65 5c 22 22 l::hash value\""
0a30: 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 , -1));....retur
0a40: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d n(TCL_ERROR);..}
0a50: 0a 0a 09 68 61 73 68 76 61 6c 20 3d 20 74 63 6c ...hashval = tcl
0a60: 73 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f system_internal_
0a70: 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 6f simplehash_obj(o
0a80: 62 6a 76 5b 31 5d 29 3b 0a 0a 09 68 61 73 68 76 bjv[1]);...hashv
0a90: 61 6c 5f 6f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 al_obj = Tcl_New
0aa0: 4f 62 6a 28 29 3b 0a 09 54 63 6c 5f 53 65 74 57 Obj();..Tcl_SetW
0ab0: 69 64 65 49 6e 74 4f 62 6a 28 68 61 73 68 76 61 ideIntObj(hashva
0ac0: 6c 5f 6f 62 6a 2c 20 68 61 73 68 76 61 6c 29 3b l_obj, hashval);
0ad0: 0a 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
0ae0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 68 61 73 68 ult(interp, hash
0af0: 76 61 6c 5f 6f 62 6a 29 3b 0a 0a 09 72 65 74 75 val_obj);...retu
0b00: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 rn(TCL_OK);.}..s
0b10: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 73 79 73 tatic int tclsys
0b20: 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 67 65 74 tem_internal_get
0b30: 73 6f 63 6b 28 69 6e 74 20 2a 73 6f 63 6b 5f 76 sock(int *sock_v
0b40: 34 5f 6f 75 74 2c 20 69 6e 74 20 2a 73 6f 63 6b 4_out, int *sock
0b50: 5f 76 36 5f 6f 75 74 29 20 7b 0a 09 69 6e 74 20 _v6_out) {..int
0b60: 73 6f 63 6b 5f 76 34 20 3d 20 2d 31 2c 20 73 6f sock_v4 = -1, so
0b70: 63 6b 5f 76 36 20 3d 20 2d 31 3b 0a 09 69 6e 74 ck_v6 = -1;..int
0b80: 20 73 6f 63 6b 3b 0a 0a 09 69 66 20 28 73 6f 63 sock;...if (soc
0b90: 6b 5f 76 34 5f 6f 75 74 20 3d 3d 20 4e 55 4c 4c k_v4_out == NULL
0ba0: 20 26 26 20 73 6f 63 6b 5f 76 36 5f 6f 75 74 20 && sock_v6_out
0bb0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 == NULL) {...ret
0bc0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 urn(-1);..}...if
0bd0: 20 28 73 6f 63 6b 5f 76 34 5f 6f 75 74 20 21 3d (sock_v4_out !=
0be0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 0a 09 09 NULL) {.../*...
0bf0: 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 49 50 76 * Check for IPv
0c00: 34 20 73 75 70 70 6f 72 74 20 62 65 66 6f 72 65 4 support before
0c10: 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 trying to creat
0c20: 65 20 61 6e 20 49 50 76 34 20 73 6f 63 6b 65 74 e an IPv4 socket
0c30: 20 74 6f 0a 09 09 20 2a 20 61 76 6f 69 64 20 64 to... * avoid d
0c40: 65 6d 61 6e 64 2d 6c 6f 61 64 69 6e 67 20 49 50 emand-loading IP
0c50: 76 34 20 28 58 58 58 3a 20 54 4f 44 4f 29 0a 09 v4 (XXX: TODO)..
0c60: 09 20 2a 2f 0a 09 09 73 6f 63 6b 5f 76 34 20 3d . */...sock_v4 =
0c70: 20 73 6f 63 6b 65 74 28 41 46 5f 49 4e 45 54 2c socket(AF_INET,
0c80: 20 53 4f 43 4b 5f 44 47 52 41 4d 2c 20 30 29 3b SOCK_DGRAM, 0);
0c90: 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 ..}...if (sock_v
0ca0: 36 5f 6f 75 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 6_out != NULL) {
0cb0: 0a 09 09 2f 2a 0a 09 09 20 2a 20 43 68 65 63 6b .../*... * Check
0cc0: 20 66 6f 72 20 49 50 76 36 20 73 75 70 70 6f 72 for IPv6 suppor
0cd0: 74 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 t before trying
0ce0: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 49 50 76 to create an IPv
0cf0: 36 20 73 6f 63 6b 65 74 20 74 6f 0a 09 09 20 2a 6 socket to... *
0d00: 20 61 76 6f 69 64 20 64 65 6d 61 6e 64 2d 6c 6f avoid demand-lo
0d10: 61 64 69 6e 67 20 49 50 76 36 20 28 58 58 58 3a ading IPv6 (XXX:
0d20: 20 54 4f 44 4f 29 0a 09 09 20 2a 2f 0a 09 09 73 TODO)... */...s
0d30: 6f 63 6b 5f 76 36 20 3d 20 73 6f 63 6b 65 74 28 ock_v6 = socket(
0d40: 41 46 5f 49 4e 45 54 36 2c 20 53 4f 43 4b 5f 44 AF_INET6, SOCK_D
0d50: 47 52 41 4d 2c 20 30 29 3b 0a 09 7d 0a 0a 09 2f GRAM, 0);..}.../
0d60: 2a 20 50 69 63 6b 20 61 20 73 6f 63 6b 65 74 20 * Pick a socket
0d70: 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 to query for the
0d80: 20 69 6e 74 65 72 66 61 63 65 20 6c 69 73 74 20 interface list
0d90: 2a 2f 0a 09 69 66 20 28 73 6f 63 6b 5f 76 34 20 */..if (sock_v4
0da0: 3d 3d 20 2d 31 20 26 26 20 73 6f 63 6b 5f 76 36 == -1 && sock_v6
0db0: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 72 65 74 75 == -1) {...retu
0dc0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 rn(-1);..}...if
0dd0: 28 73 6f 63 6b 5f 76 36 20 21 3d 20 2d 31 29 20 (sock_v6 != -1)
0de0: 7b 0a 09 09 73 6f 63 6b 20 3d 20 73 6f 63 6b 5f {...sock = sock_
0df0: 76 36 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 v6;..} else {...
0e00: 73 6f 63 6b 20 3d 20 73 6f 63 6b 5f 76 34 3b 0a sock = sock_v4;.
0e10: 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 34 .}...if (sock_v4
0e20: 5f 6f 75 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a _out != NULL) {.
0e30: 09 09 2a 73 6f 63 6b 5f 76 34 5f 6f 75 74 20 3d ..*sock_v4_out =
0e40: 20 73 6f 63 6b 5f 76 34 3b 0a 09 7d 0a 0a 09 69 sock_v4;..}...i
0e50: 66 20 28 73 6f 63 6b 5f 76 36 5f 6f 75 74 20 21 f (sock_v6_out !
0e60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 73 6f 63 = NULL) {...*soc
0e70: 6b 5f 76 36 5f 6f 75 74 20 3d 20 73 6f 63 6b 5f k_v6_out = sock_
0e80: 76 36 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 v6;..}...return(
0e90: 73 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 sock);.}../*. *
0ea0: 4c 6f 77 2d 6c 65 76 65 6c 20 53 79 73 74 65 6d Low-level System
0eb0: 20 43 61 6c 6c 20 57 72 61 70 70 65 72 20 50 72 Call Wrapper Pr
0ec0: 6f 63 65 64 75 72 65 73 0a 20 2a 0a 20 2a 20 54 ocedures. *. * T
0ed0: 68 65 73 65 20 70 72 6f 63 65 64 75 72 65 73 20 hese procedures
0ee0: 73 68 6f 75 6c 64 20 6d 69 6e 69 6d 61 6c 6c 79 should minimally
0ef0: 20 77 72 61 70 20 4c 69 6e 75 78 20 6f 72 20 55 wrap Linux or U
0f00: 4e 49 58 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 NIX system calls
0f10: 20 74 6f 0a 20 2a 20 65 78 70 6f 73 65 20 74 6f to. * expose to
0f20: 20 74 68 65 20 54 63 6c 2d 6c 65 76 65 6c 2e 20 the Tcl-level.
0f30: 20 57 68 65 72 65 20 70 6f 73 73 69 62 6c 65 20 Where possible
0f40: 61 63 63 65 70 74 20 73 79 6d 62 6f 6c 69 63 20 accept symbolic
0f50: 6e 61 6d 65 73 20 72 61 74 68 65 72 0a 20 2a 20 names rather. *
0f60: 74 68 61 6e 20 6e 75 6d 65 72 69 63 20 76 61 6c than numeric val
0f70: 75 65 73 20 28 2e 65 2e 67 2c 20 6c 69 73 74 20 ues (.e.g, list
0f80: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 4f 52 20 of values to OR
0f90: 74 6f 67 65 74 68 65 72 20 74 6f 20 67 65 74 20 together to get
0fa0: 66 6c 61 67 73 29 2e 0a 20 2a 2f 0a 73 74 61 74 flags).. */.stat
0fb0: 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 65 6d ic int tclsystem
0fc0: 5f 6d 6f 75 6e 74 28 43 6c 69 65 6e 74 44 61 74 _mount(ClientDat
0fd0: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 a cd, Tcl_Interp
0fe0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
0ff0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e jc, Tcl_Obj *CON
1000: 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 ST objv[]) {..Tc
1010: 6c 5f 4f 62 6a 20 2a 6d 6f 75 6e 74 66 6c 61 67 l_Obj *mountflag
1020: 73 5f 6f 62 6a 2c 20 2a 2a 6d 6f 75 6e 74 66 6c s_obj, **mountfl
1030: 61 67 73 5f 6c 69 73 74 2c 20 2a 6d 6f 75 6e 74 ags_list, *mount
1040: 66 6c 61 67 3b 0a 09 69 6e 74 20 6d 6f 75 6e 74 flag;..int mount
1050: 66 6c 61 67 73 5f 6c 69 73 74 5f 6c 65 6e 3b 0a flags_list_len;.
1060: 09 63 68 61 72 20 2a 73 6f 75 72 63 65 2c 20 2a .char *source, *
1070: 74 61 72 67 65 74 2c 20 2a 66 73 74 79 70 65 3b target, *fstype;
1080: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
1090: 6d 6f 75 6e 74 66 6c 61 67 73 20 3d 20 30 3b 0a mountflags = 0;.
10a0: 09 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 4e 55 .void *data = NU
10b0: 4c 4c 3b 0a 09 69 6e 74 20 6d 6f 75 6e 74 5f 72 LL;..int mount_r
10c0: 65 74 2c 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 69 et, tcl_ret;...i
10d0: 66 20 28 6f 62 6a 63 20 3c 20 35 20 7c 7c 20 6f f (objc < 5 || o
10e0: 62 6a 63 20 3e 20 36 29 20 7b 0a 09 09 54 63 6c bjc > 6) {...Tcl
10f0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
1100: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 terp, Tcl_NewStr
1110: 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 ingObj("wrong #
1120: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 args: should be
1130: 5c 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 73 63 \"::system::sysc
1140: 61 6c 6c 3a 3a 6d 6f 75 6e 74 20 73 6f 75 72 63 all::mount sourc
1150: 65 20 74 61 72 67 65 74 20 66 73 74 79 70 65 20 e target fstype
1160: 6d 6f 75 6e 74 66 6c 61 67 73 20 3f 64 61 74 61 mountflags ?data
1170: 3f 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 ?\"", -1));....r
1180: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
1190: 3b 0a 09 7d 0a 0a 09 73 6f 75 72 63 65 20 3d 20 ;..}...source =
11a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
11b0: 6a 76 5b 31 5d 29 3b 0a 09 74 61 72 67 65 74 20 jv[1]);..target
11c0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 = Tcl_GetString(
11d0: 6f 62 6a 76 5b 32 5d 29 3b 0a 09 66 73 74 79 70 objv[2]);..fstyp
11e0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
11f0: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 6d 6f 75 g(objv[3]);..mou
1200: 6e 74 66 6c 61 67 73 5f 6f 62 6a 20 3d 20 6f 62 ntflags_obj = ob
1210: 6a 76 5b 34 5d 3b 0a 0a 09 69 66 20 28 6f 62 6a jv[4];...if (obj
1220: 63 20 3d 3d 20 36 29 20 7b 0a 09 09 64 61 74 61 c == 6) {...data
1230: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
1240: 28 6f 62 6a 76 5b 35 5d 29 3b 0a 09 7d 0a 0a 09 (objv[5]);..}...
1250: 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 4c 69 tcl_ret = Tcl_Li
1260: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
1270: 28 69 6e 74 65 72 70 2c 20 6d 6f 75 6e 74 66 6c (interp, mountfl
1280: 61 67 73 5f 6f 62 6a 2c 20 26 6d 6f 75 6e 74 66 ags_obj, &mountf
1290: 6c 61 67 73 5f 6c 69 73 74 5f 6c 65 6e 2c 20 26 lags_list_len, &
12a0: 6d 6f 75 6e 74 66 6c 61 67 73 5f 6c 69 73 74 29 mountflags_list)
12b0: 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 ;..if (tcl_ret !
12c0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
12d0: 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09 turn(tcl_ret);..
12e0: 7d 0a 0a 09 66 6f 72 20 28 3b 20 6d 6f 75 6e 74 }...for (; mount
12f0: 66 6c 61 67 73 5f 6c 69 73 74 5f 6c 65 6e 20 3e flags_list_len >
1300: 20 30 3b 20 6d 6f 75 6e 74 66 6c 61 67 73 5f 6c 0; mountflags_l
1310: 69 73 74 5f 6c 65 6e 2d 2d 2c 6d 6f 75 6e 74 66 ist_len--,mountf
1320: 6c 61 67 73 5f 6c 69 73 74 2b 2b 29 20 7b 0a 09 lags_list++) {..
1330: 09 6d 6f 75 6e 74 66 6c 61 67 20 3d 20 6d 6f 75 .mountflag = mou
1340: 6e 74 66 6c 61 67 73 5f 6c 69 73 74 5b 30 5d 3b ntflags_list[0];
1350: 0a 0a 09 09 73 77 69 74 63 68 20 28 74 63 6c 73 ....switch (tcls
1360: 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 ystem_internal_s
1370: 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 6d 6f implehash_obj(mo
1380: 75 6e 74 66 6c 61 67 29 29 20 7b 0a 23 69 66 64 untflag)) {.#ifd
1390: 65 66 20 4d 53 5f 42 49 4e 44 0a 09 09 09 63 61 ef MS_BIND....ca
13a0: 73 65 20 30 78 38 35 32 36 37 34 34 3a 20 2f 2a se 0x8526744: /*
13b0: 20 42 49 4e 44 20 2a 2f 0a 09 09 09 09 6d 6f 75 BIND */.....mou
13c0: 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 42 49 ntflags |= MS_BI
13d0: 4e 44 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 ND;.....break;.#
13e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53 5f endif.#ifdef MS_
13f0: 44 49 52 53 59 4e 43 0a 09 09 09 63 61 73 65 20 DIRSYNC....case
1400: 30 78 32 61 66 66 34 31 63 33 3a 20 2f 2a 20 44 0x2aff41c3: /* D
1410: 49 52 53 59 4e 43 20 2a 2f 0a 09 09 09 09 6d 6f IRSYNC */.....mo
1420: 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 44 untflags |= MS_D
1430: 49 52 53 59 4e 43 3b 0a 09 09 09 09 62 72 65 61 IRSYNC;.....brea
1440: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 k;.#endif.#ifdef
1450: 20 4d 53 5f 4d 41 4e 44 4c 4f 43 4b 0a 09 09 09 MS_MANDLOCK....
1460: 63 61 73 65 20 30 78 34 31 30 64 62 63 62 3a 20 case 0x410dbcb:
1470: 2f 2a 20 4d 41 4e 44 4c 4f 43 4b 20 2a 2f 0a 09 /* MANDLOCK */..
1480: 09 09 09 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d ...mountflags |=
1490: 20 4d 53 5f 4d 41 4e 44 4c 4f 43 4b 3b 0a 09 09 MS_MANDLOCK;...
14a0: 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
14b0: 23 69 66 64 65 66 20 4d 53 5f 4d 4f 56 45 0a 09 #ifdef MS_MOVE..
14c0: 09 09 63 61 73 65 20 30 78 39 62 33 65 62 34 35 ..case 0x9b3eb45
14d0: 3a 20 2f 2a 20 4d 4f 56 45 20 2a 2f 0a 09 09 09 : /* MOVE */....
14e0: 09 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d .mountflags |= M
14f0: 53 5f 4d 4f 56 45 3b 0a 09 09 09 09 62 72 65 61 S_MOVE;.....brea
1500: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 k;.#endif.#ifdef
1510: 20 4d 53 5f 4e 4f 41 54 49 4d 45 0a 09 09 09 63 MS_NOATIME....c
1520: 61 73 65 20 30 78 31 61 30 66 35 38 63 35 3a 20 ase 0x1a0f58c5:
1530: 2f 2a 20 4e 4f 41 54 49 4d 45 20 2a 2f 0a 09 09 /* NOATIME */...
1540: 09 09 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 ..mountflags |=
1550: 4d 53 5f 4e 4f 41 54 49 4d 45 3b 0a 09 09 09 09 MS_NOATIME;.....
1560: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
1570: 66 64 65 66 20 4d 53 5f 4e 4f 44 45 56 0a 09 09 fdef MS_NODEV...
1580: 09 63 61 73 65 20 30 78 65 39 66 31 32 30 64 36 .case 0xe9f120d6
1590: 3a 20 2f 2a 20 4e 4f 44 45 56 20 2a 2f 0a 09 09 : /* NODEV */...
15a0: 09 09 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 ..mountflags |=
15b0: 4d 53 5f 4e 4f 44 45 56 3b 0a 09 09 09 09 62 72 MS_NODEV;.....br
15c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 eak;.#endif.#ifd
15d0: 65 66 20 4d 53 5f 4e 4f 44 49 52 41 54 49 4d 45 ef MS_NODIRATIME
15e0: 0a 09 09 09 63 61 73 65 20 30 78 64 65 30 38 66 ....case 0xde08f
15f0: 66 34 35 3a 20 2f 2a 20 4e 4f 44 49 52 41 54 49 f45: /* NODIRATI
1600: 4d 45 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74 66 ME */.....mountf
1610: 6c 61 67 73 20 7c 3d 20 4d 53 5f 4e 4f 44 49 52 lags |= MS_NODIR
1620: 41 54 49 4d 45 3b 0a 09 09 09 09 62 72 65 61 6b ATIME;.....break
1630: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
1640: 4d 53 5f 4e 4f 45 58 45 43 0a 09 09 09 63 61 73 MS_NOEXEC....cas
1650: 65 20 30 78 66 38 62 37 31 38 63 33 3a 20 2f 2a e 0xf8b718c3: /*
1660: 20 4e 4f 45 58 45 43 20 2a 2f 0a 09 09 09 09 6d NOEXEC */.....m
1670: 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f ountflags |= MS_
1680: 4e 4f 45 58 45 43 3b 0a 09 09 09 09 62 72 65 61 NOEXEC;.....brea
1690: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 k;.#endif.#ifdef
16a0: 20 4d 53 5f 4e 4f 53 55 49 44 0a 09 09 09 63 61 MS_NOSUID....ca
16b0: 73 65 20 30 78 66 61 37 34 35 65 63 34 3a 20 2f se 0xfa745ec4: /
16c0: 2a 20 4e 4f 53 55 49 44 20 2a 2f 0a 09 09 09 09 * NOSUID */.....
16d0: 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 mountflags |= MS
16e0: 5f 4e 4f 53 55 49 44 3b 0a 09 09 09 09 62 72 65 _NOSUID;.....bre
16f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ak;.#endif.#ifde
1700: 66 20 4d 53 5f 52 44 4f 4e 4c 59 0a 09 09 09 63 f MS_RDONLY....c
1710: 61 73 65 20 30 78 34 39 66 32 65 63 35 39 3a 20 ase 0x49f2ec59:
1720: 2f 2a 20 52 44 4f 4e 4c 59 20 2a 2f 0a 09 09 09 /* RDONLY */....
1730: 09 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d .mountflags |= M
1740: 53 5f 52 44 4f 4e 4c 59 3b 0a 09 09 09 09 62 72 S_RDONLY;.....br
1750: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 eak;.#endif.#ifd
1760: 65 66 20 4d 53 5f 52 45 4c 41 54 49 4d 45 0a 09 ef MS_RELATIME..
1770: 09 09 63 61 73 65 20 30 78 34 38 31 39 35 34 63 ..case 0x481954c
1780: 35 3a 20 2f 2a 20 52 45 4c 41 54 49 4d 45 20 2a 5: /* RELATIME *
1790: 2f 0a 09 09 09 09 6d 6f 75 6e 74 66 6c 61 67 73 /.....mountflags
17a0: 20 7c 3d 20 4d 53 5f 52 45 4c 41 54 49 4d 45 3b |= MS_RELATIME;
17b0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 .....break;.#end
17c0: 69 66 0a 23 69 66 64 65 66 20 4d 53 5f 52 45 4d if.#ifdef MS_REM
17d0: 4f 55 4e 54 0a 09 09 09 63 61 73 65 20 30 78 64 OUNT....case 0xd
17e0: 39 35 30 37 31 35 34 3a 20 2f 2a 20 52 45 4d 4f 9507154: /* REMO
17f0: 55 4e 54 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74 UNT */.....mount
1800: 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 52 45 4d 4f flags |= MS_REMO
1810: 55 4e 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a UNT;.....break;.
1820: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53 #endif.#ifdef MS
1830: 5f 53 49 4c 45 4e 54 0a 09 09 09 63 61 73 65 20 _SILENT....case
1840: 30 78 39 39 39 30 32 39 35 34 3a 20 2f 2a 20 53 0x99902954: /* S
1850: 49 4c 45 4e 54 20 2a 2f 0a 09 09 09 09 6d 6f 75 ILENT */.....mou
1860: 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 53 49 ntflags |= MS_SI
1870: 4c 45 4e 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b LENT;.....break;
1880: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d .#endif.#ifdef M
1890: 53 5f 53 54 52 49 43 54 41 54 49 4d 45 0a 09 09 S_STRICTATIME...
18a0: 09 63 61 73 65 20 30 78 35 36 32 66 61 30 34 35 .case 0x562fa045
18b0: 3a 20 2f 2a 20 53 54 52 49 43 54 41 54 49 4d 45 : /* STRICTATIME
18c0: 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74 66 6c 61 */.....mountfla
18d0: 67 73 20 7c 3d 20 4d 53 5f 53 54 52 49 43 54 41 gs |= MS_STRICTA
18e0: 54 49 4d 45 3b 0a 09 09 09 09 62 72 65 61 6b 3b TIME;.....break;
18f0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d .#endif.#ifdef M
1900: 53 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 09 09 S_SYNCHRONOUS...
1910: 09 63 61 73 65 20 30 78 62 66 37 39 39 33 35 33 .case 0xbf799353
1920: 3a 20 2f 2a 20 53 59 4e 43 48 52 4f 4e 4f 55 53 : /* SYNCHRONOUS
1930: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 61 37 */....case 0xa7
1940: 36 36 37 34 33 3a 20 2f 2a 20 53 59 4e 43 20 2a 66743: /* SYNC *
1950: 2f 0a 09 09 09 09 6d 6f 75 6e 74 66 6c 61 67 73 /.....mountflags
1960: 20 7c 3d 20 4d 53 5f 53 59 4e 43 48 52 4f 4e 4f |= MS_SYNCHRONO
1970: 55 53 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 US;.....break;.#
1980: 65 6e 64 69 66 0a 09 09 09 64 65 66 61 75 6c 74 endif....default
1990: 3a 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a :.....Tcl_SetObj
19a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
19b0: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e cl_ObjPrintf("un
19c0: 6b 6e 6f 77 6e 20 65 6c 65 6d 65 6e 74 20 69 6e known element in
19d0: 20 6d 6f 75 6e 74 66 6c 61 67 73 3a 20 5c 22 25 mountflags: \"%
19e0: 73 5c 22 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 s\"", Tcl_GetStr
19f0: 69 6e 67 28 6d 6f 75 6e 74 66 6c 61 67 29 29 29 ing(mountflag)))
1a00: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43 ;......return(TC
1a10: 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d L_ERROR);...}..}
1a20: 0a 0a 09 6d 6f 75 6e 74 5f 72 65 74 20 3d 20 6d ...mount_ret = m
1a30: 6f 75 6e 74 28 73 6f 75 72 63 65 2c 20 74 61 72 ount(source, tar
1a40: 67 65 74 2c 20 66 73 74 79 70 65 2c 20 6d 6f 75 get, fstype, mou
1a50: 6e 74 66 6c 61 67 73 2c 20 64 61 74 61 29 3b 0a ntflags, data);.
1a60: 09 69 66 20 28 6d 6f 75 6e 74 5f 72 65 74 20 21 .if (mount_ret !
1a70: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 = 0) {...Tcl_Set
1a80: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
1a90: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1aa0: 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e bj(strerror(errn
1ab0: 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 o), -1));....ret
1ac0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
1ad0: 09 7d 0a 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 .}...Tcl_SetObjR
1ae0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
1af0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 l_NewStringObj(t
1b00: 61 72 67 65 74 2c 20 2d 31 29 29 3b 0a 0a 09 72 arget, -1));...r
1b10: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d eturn(TCL_OK);.}
1b20: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c ..static int tcl
1b30: 73 79 73 74 65 6d 5f 75 6d 6f 75 6e 74 28 43 6c system_umount(Cl
1b40: 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c ientData cd, Tcl
1b50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
1b60: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
1b70: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d bj *CONST objv[]
1b80: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 66 ) {..Tcl_Obj **f
1b90: 6c 61 67 73 2c 20 2a 66 6c 61 67 3b 0a 09 54 63 lags, *flag;..Tc
1ba0: 6c 5f 4f 62 6a 20 2a 70 61 74 68 6e 61 6d 65 5f l_Obj *pathname_
1bb0: 6f 62 6a 3b 0a 09 63 68 61 72 20 2a 70 61 74 68 obj;..char *path
1bc0: 6e 61 6d 65 3b 0a 09 69 6e 74 20 75 6d 6f 75 6e name;..int umoun
1bd0: 74 32 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 69 t2_flags = 0;..i
1be0: 6e 74 20 66 6c 61 67 73 5f 63 6e 74 3b 0a 09 69 nt flags_cnt;..i
1bf0: 6e 74 20 63 68 6b 5f 72 65 74 2c 20 74 63 6c 5f nt chk_ret, tcl_
1c00: 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 ret;...if (objc
1c10: 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 < 2 || objc > 3)
1c20: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
1c30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
1c40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1c50: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 wrong # args: sh
1c60: 6f 75 6c 64 20 62 65 20 5c 22 73 79 73 74 65 6d ould be \"system
1c70: 3a 3a 73 79 73 63 61 6c 6c 3a 3a 75 6d 6f 75 6e ::syscall::umoun
1c80: 74 20 64 69 72 20 3f 66 6c 61 67 73 3f 5c 22 22 t dir ?flags?\""
1c90: 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 , -1));....retur
1ca0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d n(TCL_ERROR);..}
1cb0: 0a 0a 09 70 61 74 68 6e 61 6d 65 5f 6f 62 6a 20 ...pathname_obj
1cc0: 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 09 70 61 74 68 = objv[1];..path
1cd0: 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 name = Tcl_GetSt
1ce0: 72 69 6e 67 28 70 61 74 68 6e 61 6d 65 5f 6f 62 ring(pathname_ob
1cf0: 6a 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 61 20 64 j);.../* Set a d
1d00: 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 76 61 efault return va
1d10: 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 53 65 74 4f lue */..Tcl_SetO
1d20: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
1d30: 20 70 61 74 68 6e 61 6d 65 5f 6f 62 6a 29 3b 0a pathname_obj);.
1d40: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 ..if (objc == 3)
1d50: 20 7b 0a 09 09 74 63 6c 5f 72 65 74 20 3d 20 54 {...tcl_ret = T
1d60: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
1d70: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 ments(interp, ob
1d80: 6a 76 5b 32 5d 2c 20 26 66 6c 61 67 73 5f 63 6e jv[2], &flags_cn
1d90: 74 2c 20 26 66 6c 61 67 73 29 3b 0a 09 09 69 66 t, &flags);...if
1da0: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c (tcl_ret != TCL
1db0: 5f 4f 4b 29 20 7b 0a 09 09 09 72 65 74 75 72 6e _OK) {....return
1dc0: 28 74 63 6c 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a (tcl_ret);...}..
1dd0: 09 09 66 6f 72 20 28 3b 20 66 6c 61 67 73 5f 63 ..for (; flags_c
1de0: 6e 74 20 3e 20 30 3b 20 66 6c 61 67 73 5f 63 6e nt > 0; flags_cn
1df0: 74 2d 2d 2c 66 6c 61 67 73 2b 2b 29 20 7b 0a 09 t--,flags++) {..
1e00: 09 09 66 6c 61 67 20 3d 20 66 6c 61 67 73 5b 30 ..flag = flags[0
1e10: 5d 3b 0a 0a 09 09 09 73 77 69 74 63 68 20 28 74 ];.....switch (t
1e20: 63 6c 73 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 clsystem_interna
1e30: 6c 5f 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a l_simplehash_obj
1e40: 28 66 6c 61 67 29 29 20 7b 0a 09 09 09 09 63 61 (flag)) {.....ca
1e50: 73 65 20 30 78 36 39 66 34 61 33 63 35 3a 20 2f se 0x69f4a3c5: /
1e60: 2a 20 46 4f 52 43 45 20 2a 2f 0a 09 09 09 09 09 * FORCE */......
1e70: 75 6d 6f 75 6e 74 32 5f 66 6c 61 67 73 20 7c 3d umount2_flags |=
1e80: 20 4d 4e 54 5f 46 4f 52 43 45 3b 0a 0a 09 09 09 MNT_FORCE;.....
1e90: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 ..break;.....cas
1ea0: 65 20 30 78 35 61 39 31 37 33 63 38 3a 20 2f 2a e 0x5a9173c8: /*
1eb0: 20 44 45 54 41 43 48 20 2a 2f 0a 09 09 09 09 09 DETACH */......
1ec0: 75 6d 6f 75 6e 74 32 5f 66 6c 61 67 73 20 7c 3d umount2_flags |=
1ed0: 20 4d 4e 54 5f 44 45 54 41 43 48 3b 0a 0a 09 09 MNT_DETACH;....
1ee0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 ...break;.....ca
1ef0: 73 65 20 30 78 38 61 31 33 37 66 63 35 3a 20 2f se 0x8a137fc5: /
1f00: 2a 20 45 58 50 49 52 45 20 2a 2f 0a 09 09 09 09 * EXPIRE */.....
1f10: 09 75 6d 6f 75 6e 74 32 5f 66 6c 61 67 73 20 7c .umount2_flags |
1f20: 3d 20 4d 4e 54 5f 45 58 50 49 52 45 3b 0a 0a 09 = MNT_EXPIRE;...
1f30: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 64 ....break;.....d
1f40: 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 54 63 6c efault:......Tcl
1f50: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
1f60: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
1f70: 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 66 6c 61 ntf("unknown fla
1f80: 67 20 5c 22 25 73 5c 22 20 73 70 65 63 69 66 69 g \"%s\" specifi
1f90: 65 64 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 ed", Tcl_GetStri
1fa0: 6e 67 28 66 6c 61 67 29 29 29 3b 0a 09 0a 09 09 ng(flag)));.....
1fb0: 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ...return(TCL_ER
1fc0: 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a ROR);....}...}..
1fd0: 09 09 63 68 6b 5f 72 65 74 20 3d 20 75 6d 6f 75 ..chk_ret = umou
1fe0: 6e 74 32 28 70 61 74 68 6e 61 6d 65 2c 20 75 6d nt2(pathname, um
1ff0: 6f 75 6e 74 32 5f 66 6c 61 67 73 29 3b 0a 0a 09 ount2_flags);...
2000: 09 2f 2a 20 44 6f 20 6e 6f 74 20 72 65 74 75 72 ./* Do not retur
2010: 6e 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 n an error for t
2020: 68 69 73 20 63 61 73 65 2c 20 73 69 6e 63 65 20 his case, since
2030: 69 74 20 69 73 20 61 70 70 61 72 65 6e 74 6c 79 it is apparently
2040: 20 6e 6f 74 20 65 78 63 65 70 74 69 6f 6e 61 6c not exceptional
2050: 20 2a 2f 0a 09 09 69 66 20 28 63 68 6b 5f 72 65 */...if (chk_re
2060: 74 20 21 3d 20 30 20 26 26 20 28 75 6d 6f 75 6e t != 0 && (umoun
2070: 74 32 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 45 t2_flags & MNT_E
2080: 58 50 49 52 45 29 20 3d 3d 20 4d 4e 54 5f 45 58 XPIRE) == MNT_EX
2090: 50 49 52 45 20 26 26 20 65 72 72 6e 6f 20 3d 3d PIRE && errno ==
20a0: 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 09 54 63 EAGAIN) {....Tc
20b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
20c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
20d0: 72 69 6e 67 4f 62 6a 28 22 41 47 41 49 4e 22 2c ringObj("AGAIN",
20e0: 20 2d 31 29 29 3b 0a 0a 09 09 09 63 68 6b 5f 72 -1));.....chk_r
20f0: 65 74 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 et = 0;...}..} e
2100: 6c 73 65 20 7b 0a 09 09 63 68 6b 5f 72 65 74 20 lse {...chk_ret
2110: 3d 20 75 6d 6f 75 6e 74 28 70 61 74 68 6e 61 6d = umount(pathnam
2120: 65 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 68 6b e);..}...if (chk
2130: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 _ret != 0) {...T
2140: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
2150: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
2160: 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f tringObj(strerro
2170: 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a r(errno), -1));.
2180: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ...return(TCL_ER
2190: 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 ROR);..}...retur
21a0: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 n(TCL_OK);.}..st
21b0: 61 74 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 atic int tclsyst
21c0: 65 6d 5f 73 77 61 70 6f 6e 28 43 6c 69 65 6e 74 em_swapon(Client
21d0: 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 Data cd, Tcl_Int
21e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
21f0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
2200: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a CONST objv[]) {.
2210: 09 63 68 61 72 20 2a 70 61 74 68 6e 61 6d 65 3b .char *pathname;
2220: 0a 09 69 6e 74 20 63 68 6b 5f 72 65 74 3b 0a 0a ..int chk_ret;..
2230: 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 .if (objc != 2)
2240: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {...Tcl_SetObjRe
2250: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
2260: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 _NewStringObj("w
2270: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f rong # args: sho
2280: 75 6c 64 20 62 65 20 5c 22 73 79 73 74 65 6d 3a uld be \"system:
2290: 3a 73 79 73 63 61 6c 6c 3a 3a 73 77 61 70 6f 6e :syscall::swapon
22a0: 20 70 61 74 68 6e 61 6d 65 5c 22 22 2c 20 2d 31 pathname\"", -1
22b0: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 ));....return(TC
22c0: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 70 L_ERROR);..}...p
22d0: 61 74 68 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 athname = Tcl_Ge
22e0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
22f0: 3b 0a 0a 09 63 68 6b 5f 72 65 74 20 3d 20 73 77 ;...chk_ret = sw
2300: 61 70 6f 6e 28 70 61 74 68 6e 61 6d 65 2c 20 30 apon(pathname, 0
2310: 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 65 74 20 );..if (chk_ret
2320: 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 != 0) {...Tcl_Se
2330: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
2340: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
2350: 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 Obj(strerror(err
2360: 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 no), -1));....re
2370: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
2380: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c ..}...return(TCL
2390: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 _OK);.}..static
23a0: 69 6e 74 20 74 63 6c 73 79 73 74 65 6d 5f 73 77 int tclsystem_sw
23b0: 61 70 6f 66 66 28 43 6c 69 65 6e 74 44 61 74 61 apoff(ClientData
23c0: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 cd, Tcl_Interp
23d0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
23e0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 c, Tcl_Obj *CONS
23f0: 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 63 68 61 T objv[]) {..cha
2400: 72 20 2a 70 61 74 68 6e 61 6d 65 3b 0a 09 69 6e r *pathname;..in
2410: 74 20 63 68 6b 5f 72 65 74 3b 0a 0a 09 69 66 20 t chk_ret;...if
2420: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 09 (objc != 2) {...
2430: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
2440: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
2450: 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 StringObj("wrong
2460: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 # args: should
2470: 62 65 20 5c 22 73 79 73 74 65 6d 3a 3a 73 79 73 be \"system::sys
2480: 63 61 6c 6c 3a 3a 73 77 61 70 6f 66 66 20 70 61 call::swapoff pa
2490: 74 68 6e 61 6d 65 5c 22 22 2c 20 2d 31 29 29 3b thname\"", -1));
24a0: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 ....return(TCL_E
24b0: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 70 61 74 68 RROR);..}...path
24c0: 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 name = Tcl_GetSt
24d0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a ring(objv[1]);..
24e0: 09 63 68 6b 5f 72 65 74 20 3d 20 73 77 61 70 6f .chk_ret = swapo
24f0: 66 66 28 70 61 74 68 6e 61 6d 65 29 3b 0a 09 69 ff(pathname);..i
2500: 66 20 28 63 68 6b 5f 72 65 74 20 21 3d 20 30 29 f (chk_ret != 0)
2510: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
2520: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
2530: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 l_NewStringObj(s
2540: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20 trerror(errno),
2550: 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 -1));....return(
2560: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a TCL_ERROR);..}..
2570: 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b .return(TCL_OK);
2580: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .}..static int t
2590: 63 6c 73 79 73 74 65 6d 5f 69 6e 73 6d 6f 64 28 clsystem_insmod(
25a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 ClientData cd, T
25b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
25c0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
25d0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj *CONST objv
25e0: 5b 5d 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e []) {..Tcl_Chann
25f0: 65 6c 20 66 64 3b 0a 09 54 63 6c 5f 4f 62 6a 20 el fd;..Tcl_Obj
2600: 2a 6d 6f 64 75 6c 65 5f 66 69 6c 65 6e 61 6d 65 *module_filename
2610: 2c 20 2a 6d 6f 64 75 6c 65 5f 64 61 74 61 3b 0a , *module_data;.
2620: 09 76 6f 69 64 20 2a 6d 6f 64 75 6c 65 5f 64 61 .void *module_da
2630: 74 61 5f 76 61 6c 3b 0a 09 69 6e 74 20 6d 6f 64 ta_val;..int mod
2640: 75 6c 65 5f 64 61 74 61 5f 6c 65 6e 3b 0a 09 69 ule_data_len;..i
2650: 6e 74 20 72 65 61 64 5f 72 65 74 2c 20 63 68 6b nt read_ret, chk
2660: 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 _ret;...if (objc
2670: 20 3c 20 32 29 20 7b 0a 09 09 54 63 6c 5f 53 65 < 2) {...Tcl_Se
2680: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
2690: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
26a0: 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 Obj("wrong # arg
26b0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 73 s: should be \"s
26c0: 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a ystem::syscall::
26d0: 69 6e 73 6d 6f 64 20 66 69 6c 65 6e 61 6d 65 20 insmod filename
26e0: 3f 61 72 67 73 20 2e 2e 2e 3f 5c 22 22 2c 20 2d ?args ...?\"", -
26f0: 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 1));....return(T
2700: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 CL_ERROR);..}...
2710: 6d 6f 64 75 6c 65 5f 66 69 6c 65 6e 61 6d 65 20 module_filename
2720: 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 0a 09 66 64 20 = objv[1];...fd
2730: 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 = Tcl_FSOpenFile
2740: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
2750: 6d 6f 64 75 6c 65 5f 66 69 6c 65 6e 61 6d 65 2c module_filename,
2760: 20 22 72 22 2c 20 30 36 30 30 29 3b 0a 09 69 66 "r", 0600);..if
2770: 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (fd == NULL) {.
2780: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
2790: 4f 52 29 3b 0a 09 7d 0a 0a 09 63 68 6b 5f 72 65 OR);..}...chk_re
27a0: 74 20 3d 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e t = Tcl_SetChann
27b0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
27c0: 20 66 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 fd, "-translati
27d0: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a on", "binary");.
27e0: 09 69 66 20 28 63 68 6b 5f 72 65 74 20 21 3d 20 .if (chk_ret !=
27f0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c 5f TCL_OK) {...Tcl_
2800: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 66 64 Close(interp, fd
2810: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 68 6b );....return(chk
2820: 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 6d 6f 64 75 _ret);..}...modu
2830: 6c 65 5f 64 61 74 61 20 3d 20 54 63 6c 5f 4e 65 le_data = Tcl_Ne
2840: 77 4f 62 6a 28 29 3b 0a 0a 09 72 65 61 64 5f 72 wObj();...read_r
2850: 65 74 20 3d 20 54 63 6c 5f 52 65 61 64 43 68 61 et = Tcl_ReadCha
2860: 72 73 28 66 64 2c 20 6d 6f 64 75 6c 65 5f 64 61 rs(fd, module_da
2870: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 54 63 ta, -1, 0);...Tc
2880: 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 l_Close(interp,
2890: 66 64 29 3b 0a 0a 09 69 66 20 28 72 65 61 64 5f fd);...if (read_
28a0: 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 ret <= 0) {...Tc
28b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
28c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
28d0: 72 69 6e 67 4f 62 6a 28 22 72 65 61 64 20 66 61 ringObj("read fa
28e0: 69 6c 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 iled", -1));....
28f0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
2900: 29 3b 0a 09 7d 0a 0a 09 6d 6f 64 75 6c 65 5f 64 );..}...module_d
2910: 61 74 61 5f 76 61 6c 20 3d 20 54 63 6c 5f 47 65 ata_val = Tcl_Ge
2920: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 tByteArrayFromOb
2930: 6a 28 6d 6f 64 75 6c 65 5f 64 61 74 61 2c 20 26 j(module_data, &
2940: 6d 6f 64 75 6c 65 5f 64 61 74 61 5f 6c 65 6e 29 module_data_len)
2950: 3b 0a 0a 09 63 68 6b 5f 72 65 74 20 3d 20 69 6e ;...chk_ret = in
2960: 69 74 5f 6d 6f 64 75 6c 65 28 6d 6f 64 75 6c 65 it_module(module
2970: 5f 64 61 74 61 5f 76 61 6c 2c 20 6d 6f 64 75 6c _data_val, modul
2980: 65 5f 64 61 74 61 5f 6c 65 6e 2c 20 22 22 29 3b e_data_len, "");
2990: 0a 09 69 66 20 28 63 68 6b 5f 72 65 74 20 21 3d ..if (chk_ret !=
29a0: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 0) {...Tcl_SetO
29b0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
29c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
29d0: 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f j(strerror(errno
29e0: 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 ), -1));....retu
29f0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
2a00: 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f }...return(TCL_O
2a10: 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e K);.}..static in
2a20: 74 20 74 63 6c 73 79 73 74 65 6d 5f 72 6d 6d 6f t tclsystem_rmmo
2a30: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c d(ClientData cd,
2a40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
2a50: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
2a60: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 cl_Obj *CONST ob
2a70: 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f 53 65 74 jv[]) {..Tcl_Set
2a80: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
2a90: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2aa0: 62 6a 28 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e bj("not implemen
2ab0: 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 ted", -1));...re
2ac0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
2ad0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .}..static int t
2ae0: 63 6c 73 79 73 74 65 6d 5f 6c 73 6d 6f 64 28 43 clsystem_lsmod(C
2af0: 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 lientData cd, Tc
2b00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2b10: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
2b20: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj *CONST objv[
2b30: 5d 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a ]) {..Tcl_SetObj
2b40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
2b50: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2b60: 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 "not implemented
2b70: 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72 ", -1));...retur
2b80: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a n(TCL_ERROR);.}.
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 73 .static int tcls
2ba0: 79 73 74 65 6d 5f 68 6f 73 74 6e 61 6d 65 28 43 ystem_hostname(C
2bb0: 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 lientData cd, Tc
2bc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2bd0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
2be0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj *CONST objv[
2bf0: 5d 29 20 7b 0a 09 63 68 61 72 20 68 6f 73 74 6e ]) {..char hostn
2c00: 61 6d 65 5b 48 4f 53 54 5f 4e 41 4d 45 5f 4d 41 ame[HOST_NAME_MA
2c10: 58 20 2b 20 31 5d 3b 0a 09 69 6e 74 20 63 68 6b X + 1];..int chk
2c20: 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 _ret;...if (objc
2c30: 20 3d 3d 20 31 29 20 7b 0a 09 09 2f 2a 20 4e 6f == 1) {.../* No
2c40: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e arguments given
2c50: 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 , just return th
2c60: 65 20 68 6f 73 74 6e 61 6d 65 20 2a 2f 0a 09 09 e hostname */...
2c70: 63 68 6b 5f 72 65 74 20 3d 20 67 65 74 68 6f 73 chk_ret = gethos
2c80: 74 6e 61 6d 65 28 68 6f 73 74 6e 61 6d 65 2c 20 tname(hostname,
2c90: 73 69 7a 65 6f 66 28 68 6f 73 74 6e 61 6d 65 29 sizeof(hostname)
2ca0: 29 3b 0a 09 09 69 66 20 28 63 68 6b 5f 72 65 74 );...if (chk_ret
2cb0: 20 21 3d 20 30 29 20 7b 0a 09 09 09 54 63 6c 5f != 0) {....Tcl_
2cc0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
2cd0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
2ce0: 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 ngObj(strerror(e
2cf0: 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 rrno), -1));....
2d00: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
2d10: 52 29 3b 0a 09 09 7d 0a 0a 09 09 68 6f 73 74 6e R);...}....hostn
2d20: 61 6d 65 5b 73 69 7a 65 6f 66 28 68 6f 73 74 6e ame[sizeof(hostn
2d30: 61 6d 65 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 ame) - 1] = '\0'
2d40: 3b 0a 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 ;....Tcl_SetObjR
2d50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
2d60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 68 l_NewStringObj(h
2d70: 6f 73 74 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 0a ostname, -1));..
2d80: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 ..return(TCL_OK)
2d90: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 62 6a 63 20 ;..}...if (objc
2da0: 3d 3d 20 32 29 20 7b 0a 09 09 2f 2a 20 45 78 61 == 2) {.../* Exa
2db0: 63 74 6c 79 20 6f 6e 65 20 61 72 67 75 6d 65 6e ctly one argumen
2dc0: 74 20 67 69 76 65 6e 2c 20 73 65 74 20 74 68 65 t given, set the
2dd0: 20 68 6f 73 74 6e 61 6d 65 20 2a 2f 0a 09 09 73 hostname */...s
2de0: 74 72 6e 63 70 79 28 68 6f 73 74 6e 61 6d 65 2c trncpy(hostname,
2df0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
2e00: 62 6a 76 5b 31 5d 29 2c 20 73 69 7a 65 6f 66 28 bjv[1]), sizeof(
2e10: 68 6f 73 74 6e 61 6d 65 29 29 3b 0a 09 09 68 6f hostname));...ho
2e20: 73 74 6e 61 6d 65 5b 73 69 7a 65 6f 66 28 68 6f stname[sizeof(ho
2e30: 73 74 6e 61 6d 65 29 20 2d 20 31 5d 20 3d 20 27 stname) - 1] = '
2e40: 5c 30 27 3b 0a 0a 09 09 63 68 6b 5f 72 65 74 20 \0';....chk_ret
2e50: 3d 20 73 65 74 68 6f 73 74 6e 61 6d 65 28 68 6f = sethostname(ho
2e60: 73 74 6e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 68 stname, strlen(h
2e70: 6f 73 74 6e 61 6d 65 29 29 3b 0a 09 09 69 66 20 ostname));...if
2e80: 28 63 68 6b 5f 72 65 74 20 21 3d 20 30 29 20 7b (chk_ret != 0) {
2e90: 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 ....Tcl_SetObjRe
2ea0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
2eb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74 _NewStringObj(st
2ec0: 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20 2d rerror(errno), -
2ed0: 31 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 1));.....return(
2ee0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a TCL_ERROR);...}.
2ef0: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
2f00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
2f10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 68 6f 73 NewStringObj(hos
2f20: 74 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 0a 09 09 tname, -1));....
2f30: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
2f40: 09 7d 0a 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 .}...Tcl_SetObjR
2f50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
2f60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2f70: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 wrong # args: sh
2f80: 6f 75 6c 64 20 62 65 20 5c 22 68 6f 73 74 6e 61 ould be \"hostna
2f90: 6d 65 20 3f 68 6f 73 74 6e 61 6d 65 3f 5c 22 22 me ?hostname?\""
2fa0: 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e , -1));...return
2fb0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a (TCL_ERROR);.}..
2fc0: 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 73 79 static int tclsy
2fd0: 73 74 65 6d 5f 64 6f 6d 61 69 6e 6e 61 6d 65 28 stem_domainname(
2fe0: 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 ClientData cd, T
2ff0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3000: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
3010: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj *CONST objv
3020: 5b 5d 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 []) {..Tcl_SetOb
3030: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
3040: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3050: 28 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 ("not implemente
3060: 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 d", -1));...retu
3070: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d rn(TCL_ERROR);.}
3080: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c ..static int tcl
3090: 73 79 73 74 65 6d 5f 63 68 72 6f 6f 74 28 43 6c system_chroot(Cl
30a0: 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c ientData cd, Tcl
30b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
30c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
30d0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d bj *CONST objv[]
30e0: 29 20 7b 0a 09 63 68 61 72 20 2a 70 61 74 68 6e ) {..char *pathn
30f0: 61 6d 65 3b 0a 09 69 6e 74 20 63 68 6b 5f 72 65 ame;..int chk_re
3100: 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d t;...if (objc !=
3110: 20 32 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 2) {...Tcl_SetO
3120: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
3130: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3140: 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a j("wrong # args:
3150: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 73 should be \"::s
3160: 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 63 ystem::syscall:c
3170: 68 72 6f 6f 74 20 70 61 74 68 6e 61 6d 65 5c 22 hroot pathname\"
3180: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 ", -1));....retu
3190: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
31a0: 7d 0a 0a 09 70 61 74 68 6e 61 6d 65 20 3d 20 54 }...pathname = T
31b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
31c0: 76 5b 31 5d 29 3b 0a 0a 09 63 68 6b 5f 72 65 74 v[1]);...chk_ret
31d0: 20 3d 20 63 68 72 6f 6f 74 28 70 61 74 68 6e 61 = chroot(pathna
31e0: 6d 65 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 65 me);..if (chk_re
31f0: 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f t != 0) {...Tcl_
3200: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
3210: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
3220: 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 ngObj(strerror(e
3230: 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 rrno), -1));....
3240: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
3250: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 );..}...return(T
3260: 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 CL_OK);.}..stati
3270: 63 20 69 6e 74 20 74 63 6c 73 79 73 74 65 6d 5f c int tclsystem_
3280: 70 69 76 6f 74 5f 72 6f 6f 74 28 43 6c 69 65 6e pivot_root(Clien
3290: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e tData cd, Tcl_In
32a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
32b0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
32c0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b *CONST objv[]) {
32d0: 0a 09 63 68 61 72 20 2a 6e 65 77 5f 72 6f 6f 74 ..char *new_root
32e0: 2c 20 2a 70 75 74 5f 6f 6c 64 3b 0a 09 69 6e 74 , *put_old;..int
32f0: 20 63 68 6b 5f 72 65 74 3b 0a 0a 09 69 66 20 28 chk_ret;...if (
3300: 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 09 54 objc != 3) {...T
3310: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
3320: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
3330: 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 tringObj("wrong
3340: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 # args: should b
3350: 65 20 5c 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 e \"::system::sy
3360: 73 63 61 6c 6c 3a 3a 70 69 76 6f 74 5f 72 6f 6f scall::pivot_roo
3370: 74 20 6e 65 77 5f 72 6f 6f 74 20 70 75 74 5f 6f t new_root put_o
3380: 6c 64 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 ld\"", -1));....
3390: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
33a0: 29 3b 0a 09 7d 0a 0a 09 6e 65 77 5f 72 6f 6f 74 );..}...new_root
33b0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
33c0: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 09 70 75 74 5f (objv[1]);..put_
33d0: 6f 6c 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 old = Tcl_GetStr
33e0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 09 ing(objv[2]);...
33f0: 63 68 6b 5f 72 65 74 20 3d 20 70 69 76 6f 74 5f chk_ret = pivot_
3400: 72 6f 6f 74 28 6e 65 77 5f 72 6f 6f 74 2c 20 70 root(new_root, p
3410: 75 74 5f 6f 6c 64 29 3b 0a 09 69 66 20 28 63 68 ut_old);..if (ch
3420: 6b 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 k_ret != 0) {...
3430: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
3440: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
3450: 53 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 StringObj(strerr
3460: 6f 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b or(errno), -1));
3470: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 ....return(TCL_E
3480: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 RROR);..}...retu
3490: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 rn(TCL_OK);.}..s
34a0: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 73 79 73 tatic int tclsys
34b0: 74 65 6d 5f 6d 6b 6e 6f 64 28 43 6c 69 65 6e 74 tem_mknod(Client
34c0: 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 Data cd, Tcl_Int
34d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
34e0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
34f0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a CONST objv[]) {.
3500: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
3510: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
3520: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 20 wStringObj("not
3530: 69 6d 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d 31 implemented", -1
3540: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c ));...return(TCL
3550: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 _ERROR);.}..stat
3560: 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 65 6d ic int tclsystem
3570: 5f 67 65 74 75 69 64 28 43 6c 69 65 6e 74 44 61 _getuid(ClientDa
3580: 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 ta cd, Tcl_Inter
3590: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
35a0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f bjc, Tcl_Obj *CO
35b0: 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 NST objv[]) {..T
35c0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
35d0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
35e0: 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 20 69 6d tringObj("not im
35f0: 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29 plemented", -1))
3600: 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 ;...return(TCL_E
3610: 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 RROR);.}..static
3620: 20 69 6e 74 20 74 63 6c 73 79 73 74 65 6d 5f 6b int tclsystem_k
3630: 69 6c 6c 28 43 6c 69 65 6e 74 44 61 74 61 20 63 ill(ClientData c
3640: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 d, Tcl_Interp *i
3650: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
3660: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
3670: 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f 4f objv[]) {..Tcl_O
3680: 62 6a 20 2a 73 69 67 6e 61 6c 5f 6f 62 6a 3b 0a bj *signal_obj;.
3690: 0a 09 54 63 6c 5f 57 69 64 65 49 6e 74 20 70 69 ..Tcl_WideInt pi
36a0: 64 5f 77 69 64 65 2c 20 73 69 67 5f 77 69 64 65 d_wide, sig_wide
36b0: 3b 0a 09 70 69 64 5f 74 20 70 69 64 3b 0a 09 69 ;..pid_t pid;..i
36c0: 6e 74 20 73 69 67 3b 0a 09 69 6e 74 20 6b 69 6c nt sig;..int kil
36d0: 6c 5f 72 65 74 2c 20 74 63 6c 5f 72 65 74 3b 0a l_ret, tcl_ret;.
36e0: 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29 ..if (objc != 3)
36f0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
3700: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
3710: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
3720: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 wrong # args: sh
3730: 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 73 79 73 74 ould be \"::syst
3740: 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 6b 69 6c em::syscall::kil
3750: 6c 20 70 69 64 20 73 69 67 5c 22 22 2c 20 2d 31 l pid sig\"", -1
3760: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 ));....return(TC
3770: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 74 L_ERROR);..}...t
3780: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 cl_ret = Tcl_Get
3790: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 WideIntFromObj(i
37a0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
37b0: 26 70 69 64 5f 77 69 64 65 29 3b 0a 09 69 66 20 &pid_wide);..if
37c0: 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f (tcl_ret != TCL_
37d0: 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 74 OK) {...return(t
37e0: 63 6c 5f 72 65 74 29 3b 0a 09 7d 0a 09 70 69 64 cl_ret);..}..pid
37f0: 20 3d 20 70 69 64 5f 77 69 64 65 3b 0a 0a 09 73 = pid_wide;...s
3800: 69 67 6e 61 6c 5f 6f 62 6a 20 3d 20 6f 62 6a 76 ignal_obj = objv
3810: 5b 32 5d 3b 0a 0a 09 74 63 6c 5f 72 65 74 20 3d [2];...tcl_ret =
3820: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 Tcl_GetWideIntF
3830: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 73 romObj(interp, s
3840: 69 67 6e 61 6c 5f 6f 62 6a 2c 20 26 73 69 67 5f ignal_obj, &sig_
3850: 77 69 64 65 29 3b 0a 09 69 66 20 28 74 63 6c 5f wide);..if (tcl_
3860: 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ret != TCL_OK) {
3870: 0a 09 09 73 77 69 74 63 68 20 28 74 63 6c 73 79 ...switch (tclsy
3880: 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 stem_internal_si
3890: 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 73 69 67 mplehash_obj(sig
38a0: 6e 61 6c 5f 6f 62 6a 29 29 20 7b 0a 09 09 09 63 nal_obj)) {....c
38b0: 61 73 65 20 30 78 31 32 32 61 64 30 3a 20 2f 2a ase 0x122ad0: /*
38c0: 20 48 55 50 20 2a 2f 0a 09 09 09 63 61 73 65 20 HUP */....case
38d0: 30 78 39 38 66 33 36 34 64 30 3a 20 2f 2a 20 53 0x98f364d0: /* S
38e0: 49 47 48 55 50 20 2a 2f 0a 09 09 09 09 73 69 67 IGHUP */.....sig
38f0: 20 3d 20 53 49 47 48 55 50 3b 0a 09 09 09 09 62 = SIGHUP;.....b
3900: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 reak;....case 0x
3910: 31 32 36 37 35 34 3a 20 2f 2a 20 49 4e 54 20 2a 126754: /* INT *
3920: 2f 0a 09 09 09 63 61 73 65 20 30 78 39 38 66 33 /....case 0x98f3
3930: 32 39 35 34 3a 20 2f 2a 20 53 49 47 49 4e 54 20 2954: /* SIGINT
3940: 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 */.....sig = SIG
3950: 49 4e 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a INT;.....break;.
3960: 09 09 09 63 61 73 65 20 30 78 61 33 35 36 34 64 ...case 0xa3564d
3970: 34 3a 20 2f 2a 20 51 55 49 54 20 2a 2f 0a 09 09 4: /* QUIT */...
3980: 09 63 61 73 65 20 30 78 37 61 39 32 34 32 64 34 .case 0x7a9242d4
3990: 3a 20 2f 2a 20 53 49 47 51 55 49 54 20 2a 2f 0a : /* SIGQUIT */.
39a0: 09 09 09 09 73 69 67 20 3d 20 53 49 47 51 55 49 ....sig = SIGQUI
39b0: 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 T;.....break;...
39c0: 09 63 61 73 65 20 30 78 31 32 36 36 34 63 3a 20 .case 0x12664c:
39d0: 2f 2a 20 49 4c 4c 20 2a 2f 0a 09 09 09 63 61 73 /* ILL */....cas
39e0: 65 20 30 78 39 38 66 33 32 38 34 63 3a 20 2f 2a e 0x98f3284c: /*
39f0: 20 53 49 47 49 4c 4c 20 2a 2f 0a 09 09 09 09 73 SIGILL */.....s
3a00: 69 67 20 3d 20 53 49 47 49 4c 4c 3b 0a 09 09 09 ig = SIGILL;....
3a10: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
3a20: 30 78 61 39 34 61 30 64 30 3a 20 2f 2a 20 54 52 0xa94a0d0: /* TR
3a30: 41 50 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 AP */....case 0x
3a40: 37 61 33 33 38 36 64 30 3a 20 2f 2a 20 53 49 47 7a3386d0: /* SIG
3a50: 54 52 41 50 20 2a 2f 0a 09 09 09 09 73 69 67 20 TRAP */.....sig
3a60: 3d 20 53 49 47 54 52 41 50 3b 0a 09 09 09 09 62 = SIGTRAP;.....b
3a70: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 reak;....case 0x
3a80: 38 33 30 61 39 35 34 3a 20 2f 2a 20 41 42 52 54 830a954: /* ABRT
3a90: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 38 */....case 0x78
3aa0: 39 37 38 66 35 34 3a 20 2f 2a 20 53 49 47 41 42 978f54: /* SIGAB
3ab0: 52 54 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 RT */.....sig =
3ac0: 53 49 47 41 42 52 54 3b 0a 09 09 09 09 62 72 65 SIGABRT;.....bre
3ad0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 31 32 ak;....case 0x12
3ae0: 36 37 64 34 3a 20 2f 2a 20 49 4f 54 20 2a 2f 0a 67d4: /* IOT */.
3af0: 09 09 09 63 61 73 65 20 30 78 39 38 66 33 32 39 ...case 0x98f329
3b00: 64 34 3a 20 2f 2a 20 53 49 47 49 4f 54 20 2a 2f d4: /* SIGIOT */
3b10: 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 49 4f .....sig = SIGIO
3b20: 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 T;.....break;...
3b30: 09 63 61 73 65 20 30 78 31 30 61 61 64 33 3a 20 .case 0x10aad3:
3b40: 2f 2a 20 42 55 53 20 2a 2f 0a 09 09 09 63 61 73 /* BUS */....cas
3b50: 65 20 30 78 39 38 66 31 65 34 64 33 3a 20 2f 2a e 0x98f1e4d3: /*
3b60: 20 53 49 47 42 55 53 20 2a 2f 0a 09 09 09 09 73 SIGBUS */.....s
3b70: 69 67 20 3d 20 53 49 47 42 55 53 3b 0a 09 09 09 ig = SIGBUS;....
3b80: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
3b90: 30 78 31 31 61 38 34 35 3a 20 2f 2a 20 46 50 45 0x11a845: /* FPE
3ba0: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 39 38 */....case 0x98
3bb0: 66 30 65 36 34 35 3a 20 2f 2a 20 53 49 47 46 50 f0e645: /* SIGFP
3bc0: 45 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 E */.....sig = S
3bd0: 49 47 46 50 45 3b 0a 09 09 09 09 62 72 65 61 6b IGFPE;.....break
3be0: 3b 0a 09 09 09 63 61 73 65 20 30 78 39 37 32 36 ;....case 0x9726
3bf0: 36 34 63 3a 20 2f 2a 20 4b 49 4c 4c 20 2a 2f 0a 64c: /* KILL */.
3c00: 09 09 09 63 61 73 65 20 30 78 37 39 64 35 34 30 ...case 0x79d540
3c10: 34 63 3a 20 2f 2a 20 53 49 47 4b 49 4c 4c 20 2a 4c: /* SIGKILL *
3c20: 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 4b /.....sig = SIGK
3c30: 49 4c 4c 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a ILL;.....break;.
3c40: 09 09 09 63 61 73 65 20 30 78 61 62 34 65 39 33 ...case 0xab4e93
3c50: 31 3a 20 2f 2a 20 55 53 52 31 20 2a 2f 0a 09 09 1: /* USR1 */...
3c60: 09 63 61 73 65 20 30 78 37 61 31 33 63 66 33 31 .case 0x7a13cf31
3c70: 3a 20 2f 2a 20 53 49 47 55 53 52 31 20 2a 2f 0a : /* SIGUSR1 */.
3c80: 09 09 09 09 73 69 67 20 3d 20 53 49 47 55 53 52 ....sig = SIGUSR
3c90: 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 1;.....break;...
3ca0: 09 63 61 73 65 20 30 78 61 37 31 36 33 64 36 3a .case 0xa7163d6:
3cb0: 20 2f 2a 20 53 45 47 56 20 2a 2f 0a 09 09 09 63 /* SEGV */....c
3cc0: 61 73 65 20 30 78 37 61 64 36 34 35 64 36 3a 20 ase 0x7ad645d6:
3cd0: 2f 2a 20 53 49 47 53 45 47 56 20 2a 2f 0a 09 09 /* SIGSEGV */...
3ce0: 09 09 73 69 67 20 3d 20 53 49 47 53 45 47 56 3b ..sig = SIGSEGV;
3cf0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
3d00: 61 73 65 20 30 78 61 62 34 65 39 33 32 3a 20 2f ase 0xab4e932: /
3d10: 2a 20 55 53 52 32 20 2a 2f 0a 09 09 09 63 61 73 * USR2 */....cas
3d20: 65 20 30 78 37 61 31 33 63 66 33 32 3a 20 2f 2a e 0x7a13cf32: /*
3d30: 20 53 49 47 55 53 52 32 20 2a 2f 0a 09 09 09 09 SIGUSR2 */.....
3d40: 73 69 67 20 3d 20 53 49 47 55 53 52 32 3b 0a 09 sig = SIGUSR2;..
3d50: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
3d60: 65 20 30 78 61 31 32 36 38 34 35 3a 20 2f 2a 20 e 0xa126845: /*
3d70: 50 49 50 45 20 2a 2f 0a 09 09 09 63 61 73 65 20 PIPE */....case
3d80: 30 78 37 61 62 35 34 65 34 35 3a 20 2f 2a 20 53 0x7ab54e45: /* S
3d90: 49 47 50 49 50 45 20 2a 2f 0a 09 09 09 09 73 69 IGPIPE */.....si
3da0: 67 20 3d 20 53 49 47 50 49 50 45 3b 0a 09 09 09 g = SIGPIPE;....
3db0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
3dc0: 30 78 38 33 33 32 39 34 64 3a 20 2f 2a 20 41 4c 0x833294d: /* AL
3dd0: 52 4d 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 RM */....case 0x
3de0: 37 38 39 34 30 66 34 64 3a 20 2f 2a 20 53 49 47 78940f4d: /* SIG
3df0: 41 4c 52 4d 20 2a 2f 0a 09 09 09 09 73 69 67 20 ALRM */.....sig
3e00: 3d 20 53 49 47 41 4c 52 4d 3b 0a 09 09 09 09 62 = SIGALRM;.....b
3e10: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 reak;....case 0x
3e20: 61 39 31 36 39 34 64 3a 20 2f 2a 20 54 45 52 4d a91694d: /* TERM
3e30: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 61 */....case 0x7a
3e40: 33 36 34 66 34 64 3a 20 2f 2a 20 53 49 47 54 45 364f4d: /* SIGTE
3e50: 52 4d 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 RM */.....sig =
3e60: 53 49 47 54 45 52 4d 3b 0a 09 09 09 09 62 72 65 SIGTERM;.....bre
3e70: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 34 39 ak;....case 0x49
3e80: 37 30 65 38 64 34 3a 20 2f 2a 20 53 54 4b 46 4c 70e8d4: /* STKFL
3e90: 54 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 38 T */....case 0x8
3ea0: 30 66 65 66 63 35 34 3a 20 2f 2a 20 53 49 47 53 0fefc54: /* SIGS
3eb0: 54 4b 46 4c 54 20 2a 2f 0a 09 09 09 09 73 69 67 TKFLT */.....sig
3ec0: 20 3d 20 53 49 47 53 54 4b 46 4c 54 3b 0a 09 09 = SIGSTKFLT;...
3ed0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
3ee0: 20 30 78 38 37 32 32 36 34 34 3a 20 2f 2a 20 43 0x8722644: /* C
3ef0: 48 4c 44 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 HLD */....case 0
3f00: 78 37 38 64 35 30 30 34 34 3a 20 2f 2a 20 53 49 x78d50044: /* SI
3f10: 47 43 48 4c 44 20 2a 2f 0a 09 09 09 09 73 69 67 GCHLD */.....sig
3f20: 20 3d 20 53 49 47 43 48 4c 44 3b 0a 09 09 09 09 = SIGCHLD;.....
3f30: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 break;....case 0
3f40: 78 38 37 33 65 37 35 34 3a 20 2f 2a 20 43 4f 4e x873e754: /* CON
3f50: 54 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 T */....case 0x7
3f60: 38 64 34 63 31 35 34 3a 20 2f 2a 20 53 49 47 43 8d4c154: /* SIGC
3f70: 4f 4e 54 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d ONT */.....sig =
3f80: 20 53 49 47 43 4f 4e 54 3b 0a 09 09 09 09 62 72 SIGCONT;.....br
3f90: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 61 eak;....case 0xa
3fa0: 37 35 32 37 64 30 3a 20 2f 2a 20 53 54 4f 50 20 7527d0: /* STOP
3fb0: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 61 64 */....case 0x7ad
3fc0: 32 30 31 64 30 3a 20 2f 2a 20 53 49 47 53 54 4f 201d0: /* SIGSTO
3fd0: 50 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 P */.....sig = S
3fe0: 49 47 53 54 4f 50 3b 0a 09 09 09 09 62 72 65 61 IGSTOP;.....brea
3ff0: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 61 39 34 k;....case 0xa94
4000: 65 61 35 30 3a 20 2f 2a 20 54 53 54 50 20 2a 2f ea50: /* TSTP */
4010: 0a 09 09 09 63 61 73 65 20 30 78 37 61 33 33 63 ....case 0x7a33c
4020: 63 35 30 3a 20 2f 2a 20 53 49 47 54 53 54 50 20 c50: /* SIGTSTP
4030: 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 */.....sig = SIG
4040: 54 53 54 50 3b 0a 09 09 09 09 62 72 65 61 6b 3b TSTP;.....break;
4050: 0a 09 09 09 63 61 73 65 20 30 78 61 39 35 32 34 ....case 0xa9524
4060: 63 65 3a 20 2f 2a 20 54 54 49 4e 20 2a 2f 0a 09 ce: /* TTIN */..
4070: 09 09 63 61 73 65 20 30 78 37 61 33 32 30 32 63 ..case 0x7a3202c
4080: 65 3a 20 2f 2a 20 53 49 47 54 54 49 4e 20 2a 2f e: /* SIGTTIN */
4090: 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 54 54 .....sig = SIGTT
40a0: 49 4e 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 IN;.....break;..
40b0: 09 09 63 61 73 65 20 30 78 61 39 35 32 37 64 35 ..case 0xa9527d5
40c0: 3a 20 2f 2a 20 54 54 4f 55 20 2a 2f 0a 09 09 09 : /* TTOU */....
40d0: 63 61 73 65 20 30 78 37 61 33 32 30 31 64 35 3a case 0x7a3201d5:
40e0: 20 2f 2a 20 53 49 47 54 54 4f 55 20 2a 2f 0a 09 /* SIGTTOU */..
40f0: 09 09 09 73 69 67 20 3d 20 53 49 47 54 54 4f 55 ...sig = SIGTTOU
4100: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ;.....break;....
4110: 63 61 73 65 20 30 78 31 35 36 39 34 37 3a 20 2f case 0x156947: /
4120: 2a 20 55 52 47 20 2a 2f 0a 09 09 09 63 61 73 65 * URG */....case
4130: 20 30 78 39 38 66 34 32 37 34 37 3a 20 2f 2a 20 0x98f42747: /*
4140: 53 49 47 55 52 47 20 2a 2f 0a 09 09 09 09 73 69 SIGURG */.....si
4150: 67 20 3d 20 53 49 47 55 52 47 3b 0a 09 09 09 09 g = SIGURG;.....
4160: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 break;....case 0
4170: 78 62 31 30 65 38 35 35 3a 20 2f 2a 20 58 43 50 xb10e855: /* XCP
4180: 55 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 U */....case 0x7
4190: 62 62 37 63 65 35 35 3a 20 2f 2a 20 53 49 47 58 bb7ce55: /* SIGX
41a0: 43 50 55 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d CPU */.....sig =
41b0: 20 53 49 47 58 43 50 55 3b 0a 09 09 09 09 62 72 SIGXCPU;.....br
41c0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 62 eak;....case 0xb
41d0: 31 31 61 39 64 61 3a 20 2f 2a 20 58 46 53 5a 20 11a9da: /* XFSZ
41e0: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 62 62 */....case 0x7bb
41f0: 36 38 66 64 61 3a 20 2f 2a 20 53 49 47 58 46 53 68fda: /* SIGXFS
4200: 5a 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 Z */.....sig = S
4210: 49 47 58 46 53 5a 3b 0a 09 09 09 09 62 72 65 61 IGXFSZ;.....brea
4220: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 34 38 33 k;....case 0x483
4230: 32 37 33 63 64 3a 20 2f 2a 20 56 54 41 4c 52 4d 273cd: /* VTALRM
4240: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 38 31 */....case 0x81
4250: 62 63 36 37 34 64 3a 20 2f 2a 20 53 49 47 56 54 bc674d: /* SIGVT
4260: 41 4c 52 4d 20 2a 2f 0a 09 09 09 09 73 69 67 20 ALRM */.....sig
4270: 3d 20 53 49 47 56 54 41 4c 52 4d 3b 0a 09 09 09 = SIGVTALRM;....
4280: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
4290: 30 78 61 31 34 61 37 63 36 3a 20 2f 2a 20 50 52 0xa14a7c6: /* PR
42a0: 4f 46 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 OF */....case 0x
42b0: 37 61 62 33 38 31 63 36 3a 20 2f 2a 20 53 49 47 7ab381c6: /* SIG
42c0: 50 52 4f 46 20 2a 2f 0a 09 09 09 09 73 69 67 20 PROF */.....sig
42d0: 3d 20 53 49 47 50 52 4f 46 3b 0a 09 09 09 09 62 = SIGPROF;.....b
42e0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 reak;....case 0x
42f0: 37 39 33 33 61 33 34 38 3a 20 2f 2a 20 57 49 4e 7933a348: /* WIN
4300: 43 48 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 CH */....case 0x
4310: 32 61 61 30 62 66 34 38 3a 20 2f 2a 20 53 49 47 2aa0bf48: /* SIG
4320: 57 49 4e 43 48 20 2a 2f 0a 09 09 09 09 73 69 67 WINCH */.....sig
4330: 20 3d 20 53 49 47 57 49 4e 43 48 3b 0a 09 09 09 = SIGWINCH;....
4340: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
4350: 30 78 32 34 63 66 3a 20 2f 2a 20 49 4f 20 2a 2f 0x24cf: /* IO */
4360: 0a 09 09 09 63 61 73 65 20 30 78 33 39 33 31 65 ....case 0x3931e
4370: 36 34 66 3a 20 2f 2a 20 53 49 47 49 4f 20 2a 2f 64f: /* SIGIO */
4380: 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 49 4f .....sig = SIGIO
4390: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ;.....break;....
43a0: 63 61 73 65 20 30 78 31 34 32 62 64 32 3a 20 2f case 0x142bd2: /
43b0: 2a 20 50 57 52 20 2a 2f 0a 09 09 09 63 61 73 65 * PWR */....case
43c0: 20 30 78 39 38 66 35 36 35 64 32 3a 20 2f 2a 20 0x98f565d2: /*
43d0: 53 49 47 50 57 52 20 2a 2f 0a 09 09 09 09 73 69 SIGPWR */.....si
43e0: 67 20 3d 20 53 49 47 50 57 52 3b 0a 09 09 09 09 g = SIGPWR;.....
43f0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 break;....case 0
4400: 78 31 34 65 63 64 33 3a 20 2f 2a 20 53 59 53 20 x14ecd3: /* SYS
4410: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 39 38 66 */....case 0x98f
4420: 35 61 32 64 33 3a 20 2f 2a 20 53 49 47 53 59 53 5a2d3: /* SIGSYS
4430: 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 */.....sig = SI
4440: 47 53 59 53 3b 0a 09 09 09 09 62 72 65 61 6b 3b GSYS;.....break;
4450: 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 ....default:....
4460: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
4470: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
4480: 6a 50 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e jPrintf("unknown
4490: 20 73 69 67 6e 61 6c 20 5c 22 25 73 5c 22 22 2c signal \"%s\"",
44a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 73 Tcl_GetString(s
44b0: 69 67 6e 61 6c 5f 6f 62 6a 29 29 29 3b 0a 0a 09 ignal_obj)));...
44c0: 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ...return(TCL_ER
44d0: 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 ROR);...}..} els
44e0: 65 20 7b 0a 09 09 73 69 67 20 3d 20 73 69 67 5f e {...sig = sig_
44f0: 77 69 64 65 3b 0a 09 7d 0a 0a 09 6b 69 6c 6c 5f wide;..}...kill_
4500: 72 65 74 20 3d 20 6b 69 6c 6c 28 70 69 64 2c 20 ret = kill(pid,
4510: 73 69 67 29 3b 0a 09 69 66 20 28 6b 69 6c 6c 5f sig);..if (kill_
4520: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 ret != 0) {...Tc
4530: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
4540: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
4550: 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 ringObj(strerror
4560: 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a (errno), -1));..
4570: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
4580: 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e OR);..}...return
4590: 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 (TCL_OK);.}..sta
45a0: 74 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 65 tic int tclsyste
45b0: 6d 5f 70 73 28 43 6c 69 65 6e 74 44 61 74 61 20 m_ps(ClientData
45c0: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a cd, Tcl_Interp *
45d0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
45e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 , Tcl_Obj *CONST
45f0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f objv[]) {..Tcl_
4600: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
4610: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
4620: 6e 67 4f 62 6a 28 22 6e 6f 74 20 69 6d 70 6c 65 ngObj("not imple
4630: 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a mented", -1));..
4640: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
4650: 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e R);.}..static in
4660: 74 20 74 63 6c 73 79 73 74 65 6d 5f 65 78 65 63 t tclsystem_exec
4670: 76 65 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 ve(ClientData cd
4680: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
4690: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
46a0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f Tcl_Obj *CONST o
46b0: 62 6a 76 5b 5d 29 20 7b 0a 09 63 68 61 72 20 2a bjv[]) {..char *
46c0: 2a 61 72 67 76 20 3d 20 4e 55 4c 4c 3b 0a 09 63 *argv = NULL;..c
46d0: 68 61 72 20 2a 66 69 6c 65 3b 0a 09 69 6e 74 20 har *file;..int
46e0: 69 64 78 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 idx;...if (objc
46f0: 3c 20 32 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 < 2) {...Tcl_Set
4700: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
4710: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4720: 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 bj("wrong # args
4730: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a : should be \"::
4740: 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a system::syscall:
4750: 3a 65 78 65 63 76 65 20 66 69 6c 65 20 3f 61 72 :execve file ?ar
4760: 67 73 20 2e 2e 2e 3f 5c 22 22 2c 20 2d 31 29 29 gs ...?\"", -1))
4770: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f ;....return(TCL_
4780: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ERROR);..}.../*
4790: 46 69 6e 64 20 65 78 65 63 75 74 61 62 6c 65 20 Find executable
47a0: 2a 2f 0a 09 66 69 6c 65 20 3d 20 54 63 6c 5f 47 */..file = Tcl_G
47b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
47c0: 29 3b 0a 0a 09 2f 2a 20 47 65 6e 65 72 61 74 65 );.../* Generate
47d0: 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 argument array
47e0: 2a 2f 0a 09 61 72 67 76 20 3d 20 6d 61 6c 6c 6f */..argv = mallo
47f0: 63 28 73 69 7a 65 6f 66 28 2a 61 72 67 76 29 20 c(sizeof(*argv)
4800: 2a 20 28 6f 62 6a 63 20 2d 20 31 29 29 3b 0a 0a * (objc - 1));..
4810: 09 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 .for (idx = 2; i
4820: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b dx < objc; idx++
4830: 29 20 7b 0a 09 09 61 72 67 76 5b 69 64 78 20 2d ) {...argv[idx -
4840: 20 32 5d 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 2] = Tcl_GetStr
4850: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a ing(objv[idx]);.
4860: 09 7d 0a 09 61 72 67 76 5b 6f 62 6a 63 20 2d 20 .}..argv[objc -
4870: 32 5d 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2a 20 2] = NULL;.../*
4880: 50 61 73 73 20 65 78 65 63 75 74 69 6f 6e 20 74 Pass execution t
4890: 6f 20 6e 65 77 20 66 69 6c 65 20 2a 2f 0a 09 65 o new file */..e
48a0: 78 65 63 76 65 28 66 69 6c 65 2c 20 61 72 67 76 xecve(file, argv
48b0: 2c 20 65 6e 76 69 72 6f 6e 29 3b 0a 0a 09 2f 2a , environ);.../*
48c0: 20 49 66 20 74 68 65 20 6e 65 77 20 69 6d 61 67 If the new imag
48d0: 65 20 63 6f 75 6c 64 20 6e 6f 74 20 74 61 6b 65 e could not take
48e0: 20 6f 76 65 72 2c 20 73 6f 6d 65 74 68 69 6e 67 over, something
48f0: 20 77 65 6e 74 20 77 72 6f 6e 67 20 2d 2d 20 72 went wrong -- r
4900: 65 70 6f 72 74 20 65 72 72 6f 72 20 2a 2f 0a 09 eport error */..
4910: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
4920: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
4930: 53 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 StringObj(strerr
4940: 6f 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b or(errno), -1));
4950: 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ...return(TCL_ER
4960: 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 ROR);.}..static
4970: 69 6e 74 20 74 63 6c 73 79 73 74 65 6d 5f 6c 6f int tclsystem_lo
4980: 73 65 74 75 70 28 43 6c 69 65 6e 74 44 61 74 61 setup(ClientData
4990: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 cd, Tcl_Interp
49a0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
49b0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 c, Tcl_Obj *CONS
49c0: 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 63 68 61 T objv[]) {..cha
49d0: 72 20 2a 66 69 6c 65 2c 20 2a 6c 6f 6f 70 64 65 r *file, *loopde
49e0: 76 3b 0a 09 69 6e 74 20 63 68 6b 5f 72 65 74 3b v;..int chk_ret;
49f0: 0a 09 69 6e 74 20 6c 6f 6f 70 66 64 2c 20 66 69 ..int loopfd, fi
4a00: 6c 65 66 64 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 lefd;...if (objc
4a10: 20 21 3d 20 33 29 20 7b 0a 09 09 54 63 6c 5f 53 != 3) {...Tcl_S
4a20: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
4a30: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e rp, Tcl_NewStrin
4a40: 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 gObj("wrong # ar
4a50: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 gs: should be \"
4a60: 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c ::system::syscal
4a70: 6c 3a 3a 6c 6f 73 65 74 75 70 20 6c 6f 6f 70 64 l::losetup loopd
4a80: 65 76 20 66 69 6c 65 5c 22 22 2c 20 2d 31 29 29 ev file\"", -1))
4a90: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f ;....return(TCL_
4aa0: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 6f ERROR);..}...loo
4ab0: 70 64 65 76 20 3d 20 54 63 6c 5f 47 65 74 53 74 pdev = Tcl_GetSt
4ac0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 09 ring(objv[1]);..
4ad0: 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 file = Tcl_GetSt
4ae0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a ring(objv[2]);..
4af0: 09 6c 6f 6f 70 66 64 20 3d 20 6f 70 65 6e 28 6c .loopfd = open(l
4b00: 6f 6f 70 64 65 76 2c 20 4f 5f 52 44 4f 4e 4c 59 oopdev, O_RDONLY
4b10: 29 3b 0a 09 69 66 20 28 6c 6f 6f 70 66 64 20 3c );..if (loopfd <
4b20: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 0) {...Tcl_SetO
4b30: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
4b40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
4b50: 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f j(strerror(errno
4b60: 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 ), -1));....retu
4b70: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
4b80: 7d 0a 0a 09 69 66 20 28 66 69 6c 65 5b 30 5d 20 }...if (file[0]
4b90: 21 3d 20 27 5c 30 27 29 20 7b 0a 09 09 66 69 6c != '\0') {...fil
4ba0: 65 66 64 20 3d 20 6f 70 65 6e 28 66 69 6c 65 2c efd = open(file,
4bb0: 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 09 69 66 O_RDONLY);...if
4bc0: 20 28 66 69 6c 65 66 64 20 3c 20 30 29 20 7b 0a (filefd < 0) {.
4bd0: 09 09 09 63 6c 6f 73 65 28 6c 6f 6f 70 66 64 29 ...close(loopfd)
4be0: 3b 0a 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a ;.....Tcl_SetObj
4bf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
4c00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4c10: 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c strerror(errno),
4c20: 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 -1));.....retur
4c30: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 n(TCL_ERROR);...
4c40: 7d 0a 0a 09 09 63 68 6b 5f 72 65 74 20 3d 20 69 }....chk_ret = i
4c50: 6f 63 74 6c 28 6c 6f 6f 70 66 64 2c 20 4c 4f 4f octl(loopfd, LOO
4c60: 50 5f 53 45 54 5f 46 44 2c 20 66 69 6c 65 66 64 P_SET_FD, filefd
4c70: 29 3b 0a 0a 09 09 63 6c 6f 73 65 28 66 69 6c 65 );....close(file
4c80: 66 64 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 fd);..} else {..
4c90: 09 63 68 6b 5f 72 65 74 20 3d 20 69 6f 63 74 6c .chk_ret = ioctl
4ca0: 28 6c 6f 6f 70 66 64 2c 20 4c 4f 4f 50 5f 43 4c (loopfd, LOOP_CL
4cb0: 52 5f 46 44 2c 20 30 29 3b 0a 09 7d 0a 0a 09 63 R_FD, 0);..}...c
4cc0: 6c 6f 73 65 28 6c 6f 6f 70 66 64 29 3b 0a 0a 09 lose(loopfd);...
4cd0: 69 66 20 28 63 68 6b 5f 72 65 74 20 21 3d 20 30 if (chk_ret != 0
4ce0: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a ) {...Tcl_SetObj
4cf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
4d00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4d10: 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c strerror(errno),
4d20: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e -1));....return
4d30: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a (TCL_ERROR);..}.
4d40: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 ..return(TCL_OK)
4d50: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 ;.}..static void
4d60: 20 74 63 6c 73 79 73 74 65 6d 5f 70 72 69 76 61 tclsystem_priva
4d70: 74 65 5f 61 70 70 65 6e 64 5f 73 6f 63 6b 61 64 te_append_sockad
4d80: 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a 28 54 63 6c dr_to_tclobj(Tcl
4d90: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
4da0: 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 2c 20 Tcl_Obj *list,
4db0: 63 68 61 72 20 2a 68 65 61 64 65 72 2c 20 73 74 char *header, st
4dc0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 ruct sockaddr *a
4dd0: 64 64 72 29 20 7b 0a 09 63 68 61 72 20 61 64 64 ddr) {..char add
4de0: 72 5f 62 75 66 5b 49 4e 45 54 36 5f 41 44 44 52 r_buf[INET6_ADDR
4df0: 53 54 52 4c 45 4e 20 2b 20 49 4e 45 54 5f 41 44 STRLEN + INET_AD
4e00: 44 52 53 54 52 4c 45 4e 20 2b 20 31 5d 2c 20 2a DRSTRLEN + 1], *
4e10: 63 68 6b 5f 69 6e 70 3b 0a 0a 09 73 77 69 74 63 chk_inp;...switc
4e20: 68 20 28 61 64 64 72 2d 3e 73 61 5f 66 61 6d 69 h (addr->sa_fami
4e30: 6c 79 29 20 7b 0a 09 09 63 61 73 65 20 41 46 5f ly) {...case AF_
4e40: 49 4e 45 54 3a 20 2f 2a 20 49 50 76 34 20 2a 2f INET: /* IPv4 */
4e50: 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36 ...case AF_INET6
4e60: 3a 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 09 09 09 : /* IPv6 */....
4e70: 73 77 69 74 63 68 20 28 61 64 64 72 2d 3e 73 61 switch (addr->sa
4e80: 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 09 09 63 _family) {.....c
4e90: 61 73 65 20 41 46 5f 49 4e 45 54 3a 20 2f 2a 20 ase AF_INET: /*
4ea0: 49 50 76 34 20 2a 2f 0a 09 09 09 09 09 63 68 6b IPv4 */......chk
4eb0: 5f 69 6e 70 20 3d 20 28 63 68 61 72 20 2a 29 20 _inp = (char *)
4ec0: 69 6e 65 74 5f 6e 74 6f 70 28 61 64 64 72 2d 3e inet_ntop(addr->
4ed0: 73 61 5f 66 61 6d 69 6c 79 2c 20 26 28 28 73 74 sa_family, &((st
4ee0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e ruct sockaddr_in
4ef0: 20 2a 29 20 61 64 64 72 29 2d 3e 73 69 6e 5f 61 *) addr)->sin_a
4f00: 64 64 72 2c 20 61 64 64 72 5f 62 75 66 2c 20 73 ddr, addr_buf, s
4f10: 69 7a 65 6f 66 28 61 64 64 72 5f 62 75 66 29 29 izeof(addr_buf))
4f20: 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
4f30: 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36 3a ..case AF_INET6:
4f40: 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 09 09 09 09 /* IPv6 */.....
4f50: 09 63 68 6b 5f 69 6e 70 20 3d 20 28 63 68 61 72 .chk_inp = (char
4f60: 20 2a 29 20 69 6e 65 74 5f 6e 74 6f 70 28 61 64 *) inet_ntop(ad
4f70: 64 72 2d 3e 73 61 5f 66 61 6d 69 6c 79 2c 20 26 dr->sa_family, &
4f80: 28 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 ((struct sockadd
4f90: 72 5f 69 6e 36 20 2a 29 20 61 64 64 72 29 2d 3e r_in6 *) addr)->
4fa0: 73 69 6e 36 5f 61 64 64 72 2c 20 61 64 64 72 5f sin6_addr, addr_
4fb0: 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 64 64 72 buf, sizeof(addr
4fc0: 5f 62 75 66 29 29 3b 0a 09 09 09 09 09 62 72 65 _buf));......bre
4fd0: 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 ak;....}.....if
4fe0: 28 63 68 6b 5f 69 6e 70 20 3d 3d 20 4e 55 4c 4c (chk_inp == NULL
4ff0: 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 ) {.....break;..
5000: 09 09 7d 0a 0a 09 09 09 69 66 20 28 68 65 61 64 ..}.....if (head
5010: 65 72 29 20 7b 0a 09 09 09 09 54 63 6c 5f 4c 69 er) {.....Tcl_Li
5020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5030: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 2c nt(interp, list,
5040: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5050: 6a 28 68 65 61 64 65 72 2c 20 2d 31 29 29 3b 0a j(header, -1));.
5060: 09 09 09 7d 0a 0a 09 09 09 54 63 6c 5f 4c 69 73 ...}.....Tcl_Lis
5070: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5080: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 2c 20 t(interp, list,
5090: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
50a0: 28 61 64 64 72 5f 62 75 66 2c 20 2d 31 29 29 3b (addr_buf, -1));
50b0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a .....break;..}..
50c0: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 .return;.}..stat
50d0: 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 65 6d ic int tclsystem
50e0: 5f 70 72 69 76 61 74 65 5f 67 65 74 5f 73 6f 63 _private_get_soc
50f0: 6b 61 64 64 72 5f 66 72 6f 6d 5f 6f 62 6a 28 54 kaddr_from_obj(T
5100: 63 6c 5f 4f 62 6a 20 2a 76 61 6c 75 65 2c 20 76 cl_Obj *value, v
5110: 6f 69 64 20 2a 74 61 72 67 65 74 29 20 7b 0a 09 oid *target) {..
5120: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f struct sockaddr_
5130: 69 6e 20 6c 6f 63 61 6c 5f 76 34 3b 0a 09 73 74 in local_v4;..st
5140: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e ruct sockaddr_in
5150: 36 20 6c 6f 63 61 6c 5f 76 36 3b 0a 09 63 6f 6e 6 local_v6;..con
5160: 73 74 20 63 68 61 72 20 2a 61 64 64 72 5f 73 74 st char *addr_st
5170: 72 3b 0a 09 69 6e 74 20 69 6e 65 74 70 74 6f 6e r;..int inetpton
5180: 5f 72 65 74 3b 0a 0a 09 61 64 64 72 5f 73 74 72 _ret;...addr_str
5190: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
51a0: 28 76 61 6c 75 65 29 3b 0a 0a 09 6d 65 6d 73 65 (value);...memse
51b0: 74 28 26 6c 6f 63 61 6c 5f 76 34 2c 20 30 2c 20 t(&local_v4, 0,
51c0: 73 69 7a 65 6f 66 28 6c 6f 63 61 6c 5f 76 34 29 sizeof(local_v4)
51d0: 29 3b 0a 09 69 6e 65 74 70 74 6f 6e 5f 72 65 74 );..inetpton_ret
51e0: 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 41 46 5f = inet_pton(AF_
51f0: 49 4e 45 54 2c 20 61 64 64 72 5f 73 74 72 2c 20 INET, addr_str,
5200: 26 6c 6f 63 61 6c 5f 76 34 2e 73 69 6e 5f 61 64 &local_v4.sin_ad
5210: 64 72 29 3b 0a 09 69 66 20 28 69 6e 65 74 70 74 dr);..if (inetpt
5220: 6f 6e 5f 72 65 74 20 3d 3d 20 31 29 20 7b 0a 09 on_ret == 1) {..
5230: 09 6c 6f 63 61 6c 5f 76 34 2e 73 69 6e 5f 66 61 .local_v4.sin_fa
5240: 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 3b 0a mily = AF_INET;.
5250: 0a 09 09 6d 65 6d 63 70 79 28 74 61 72 67 65 74 ...memcpy(target
5260: 2c 20 26 6c 6f 63 61 6c 5f 76 34 2c 20 73 69 7a , &local_v4, siz
5270: 65 6f 66 28 6c 6f 63 61 6c 5f 76 34 29 29 3b 0a eof(local_v4));.
5280: 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d ...return(0);..}
5290: 0a 0a 09 6d 65 6d 73 65 74 28 26 6c 6f 63 61 6c ...memset(&local
52a0: 5f 76 36 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c _v6, 0, sizeof(l
52b0: 6f 63 61 6c 5f 76 36 29 29 3b 0a 09 69 6e 65 74 ocal_v6));..inet
52c0: 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f pton_ret = inet_
52d0: 70 74 6f 6e 28 41 46 5f 49 4e 45 54 36 2c 20 61 pton(AF_INET6, a
52e0: 64 64 72 5f 73 74 72 2c 20 26 6c 6f 63 61 6c 5f ddr_str, &local_
52f0: 76 36 2e 73 69 6e 36 5f 61 64 64 72 29 3b 0a 09 v6.sin6_addr);..
5300: 69 66 20 28 69 6e 65 74 70 74 6f 6e 5f 72 65 74 if (inetpton_ret
5310: 20 3d 3d 20 31 29 20 7b 0a 09 09 6c 6f 63 61 6c == 1) {...local
5320: 5f 76 36 2e 73 69 6e 36 5f 66 61 6d 69 6c 79 20 _v6.sin6_family
5330: 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 0a 09 09 6d = AF_INET6;....m
5340: 65 6d 63 70 79 28 74 61 72 67 65 74 2c 20 26 6c emcpy(target, &l
5350: 6f 63 61 6c 5f 76 36 2c 20 73 69 7a 65 6f 66 28 ocal_v6, sizeof(
5360: 6c 6f 63 61 6c 5f 76 36 29 29 3b 0a 0a 09 09 72 local_v6));....r
5370: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72 eturn(0);..}...r
5380: 65 74 75 72 6e 28 2d 31 29 3b 0a 7d 0a 0a 73 74 eturn(-1);.}..st
5390: 61 74 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 atic int tclsyst
53a0: 65 6d 5f 69 66 63 6f 6e 66 69 67 5f 6c 69 73 74 em_ifconfig_list
53b0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 (ClientData cd,
53c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
53d0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
53e0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a l_Obj *CONST obj
53f0: 76 5b 5d 2c 20 69 6e 74 20 73 6f 63 6b 29 20 7b v[], int sock) {
5400: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 63 6c 5f 69 ..Tcl_Obj *tcl_i
5410: 66 61 63 65 5f 6c 69 73 74 3b 0a 09 73 74 72 75 face_list;..stru
5420: 63 74 20 69 66 63 6f 6e 66 20 69 66 61 63 65 73 ct ifconf ifaces
5430: 5f 63 66 67 3b 0a 09 73 74 72 75 63 74 20 69 66 _cfg;..struct if
5440: 72 65 71 20 2a 69 66 61 63 65 5f 72 65 71 20 3d req *iface_req =
5450: 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 69 66 61 63 NULL;..int ifac
5460: 65 5f 72 65 71 5f 63 6e 74 20 3d 20 32 32 34 2c e_req_cnt = 224,
5470: 20 69 66 61 63 65 5f 72 65 71 5f 6c 65 6e 3b 0a iface_req_len;.
5480: 09 69 6e 74 20 69 64 78 2c 20 69 66 61 63 65 5f .int idx, iface_
5490: 63 6e 74 3b 0a 09 69 6e 74 20 69 6f 63 74 6c 5f cnt;..int ioctl_
54a0: 72 65 74 2c 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 ret, tcl_ret;...
54b0: 69 66 61 63 65 5f 72 65 71 5f 6c 65 6e 20 3d 20 iface_req_len =
54c0: 69 66 61 63 65 5f 72 65 71 5f 63 6e 74 20 2a 20 iface_req_cnt *
54d0: 73 69 7a 65 6f 66 28 2a 69 66 61 63 65 5f 72 65 sizeof(*iface_re
54e0: 71 29 3b 0a 09 69 66 61 63 65 5f 72 65 71 20 3d q);..iface_req =
54f0: 20 6d 61 6c 6c 6f 63 28 69 66 61 63 65 5f 72 65 malloc(iface_re
5500: 71 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 69 66 61 q_len);..if (ifa
5510: 63 65 5f 72 65 71 20 3d 3d 20 4e 55 4c 4c 29 20 ce_req == NULL)
5520: 7b 0a 09 09 2f 2a 20 52 65 70 6f 72 74 20 66 61 {.../* Report fa
5530: 69 6c 75 72 65 20 2a 2f 0a 09 09 54 63 6c 5f 53 ilure */...Tcl_S
5540: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
5550: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e rp, Tcl_NewStrin
5560: 67 4f 62 6a 28 22 75 6e 61 62 6c 65 20 74 6f 20 gObj("unable to
5570: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 22 allocate memory"
5580: 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 , -1));....retur
5590: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d n(TCL_ERROR);..}
55a0: 0a 0a 09 69 66 61 63 65 73 5f 63 66 67 2e 69 66 ...ifaces_cfg.if
55b0: 63 5f 72 65 71 20 3d 20 69 66 61 63 65 5f 72 65 c_req = iface_re
55c0: 71 3b 0a 09 69 66 61 63 65 73 5f 63 66 67 2e 69 q;..ifaces_cfg.i
55d0: 66 63 5f 6c 65 6e 20 3d 20 69 66 61 63 65 5f 72 fc_len = iface_r
55e0: 65 71 5f 6c 65 6e 3b 0a 09 69 6f 63 74 6c 5f 72 eq_len;..ioctl_r
55f0: 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c et = ioctl(sock,
5600: 20 53 49 4f 43 47 49 46 43 4f 4e 46 2c 20 26 69 SIOCGIFCONF, &i
5610: 66 61 63 65 73 5f 63 66 67 29 3b 0a 09 69 66 20 faces_cfg);..if
5620: 28 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30 29 (ioctl_ret != 0)
5630: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
5640: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
5650: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
5660: 69 6f 63 74 6c 20 66 61 69 6c 65 64 22 2c 20 2d ioctl failed", -
5670: 31 29 29 3b 0a 0a 09 09 66 72 65 65 28 69 66 61 1));....free(ifa
5680: 63 65 5f 72 65 71 29 3b 0a 0a 09 09 72 65 74 75 ce_req);....retu
5690: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
56a0: 7d 0a 0a 09 69 66 61 63 65 5f 63 6e 74 20 3d 20 }...iface_cnt =
56b0: 69 66 61 63 65 73 5f 63 66 67 2e 69 66 63 5f 6c ifaces_cfg.ifc_l
56c0: 65 6e 20 2f 20 73 69 7a 65 6f 66 28 2a 69 66 61 en / sizeof(*ifa
56d0: 63 65 5f 72 65 71 29 3b 0a 0a 09 74 63 6c 5f 69 ce_req);...tcl_i
56e0: 66 61 63 65 5f 6c 69 73 74 20 3d 20 54 63 6c 5f face_list = Tcl_
56f0: 4e 65 77 4f 62 6a 28 29 3b 0a 0a 09 66 6f 72 20 NewObj();...for
5700: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 (idx = 0; idx <
5710: 69 66 61 63 65 5f 63 6e 74 3b 20 69 64 78 2b 2b iface_cnt; idx++
5720: 29 20 7b 0a 09 09 74 63 6c 5f 72 65 74 20 3d 20 ) {...tcl_ret =
5730: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5740: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5750: 20 74 63 6c 5f 69 66 61 63 65 5f 6c 69 73 74 2c tcl_iface_list,
5760: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5770: 6a 28 69 66 61 63 65 5f 72 65 71 5b 69 64 78 5d j(iface_req[idx]
5780: 2e 69 66 72 5f 6e 61 6d 65 2c 20 2d 31 29 29 3b .ifr_name, -1));
5790: 0a 09 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 ...if (tcl_ret !
57a0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 54 = TCL_OK) {....T
57b0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
57c0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
57d0: 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65 tringObj("unable
57e0: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 6c 69 to append to li
57f0: 73 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 66 st", -1));.....f
5800: 72 65 65 28 69 66 61 63 65 5f 72 65 71 29 3b 0a ree(iface_req);.
5810: 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 ....return(TCL_E
5820: 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 RROR);...}..}...
5830: 66 72 65 65 28 69 66 61 63 65 5f 72 65 71 29 3b free(iface_req);
5840: 0a 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
5850: 75 6c 74 28 69 6e 74 65 72 70 2c 20 74 63 6c 5f ult(interp, tcl_
5860: 69 66 61 63 65 5f 6c 69 73 74 29 3b 0a 0a 09 72 iface_list);...r
5870: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d eturn(TCL_OK);.}
5880: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c ..static int tcl
5890: 73 79 73 74 65 6d 5f 69 66 63 6f 6e 66 69 67 5f system_ifconfig_
58a0: 69 6e 66 6f 28 43 6c 69 65 6e 74 44 61 74 61 20 info(ClientData
58b0: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a cd, Tcl_Interp *
58c0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
58d0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 , Tcl_Obj *CONST
58e0: 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73 6f 63 objv[], int soc
58f0: 6b 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 34 2c 20 k, int sock_v4,
5900: 69 6e 74 20 73 6f 63 6b 5f 76 36 29 20 7b 0a 09 int sock_v6) {..
5910: 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 6c 69 73 74 Tcl_Obj *retlist
5920: 2c 20 2a 66 6c 61 67 73 3b 0a 09 73 74 72 75 63 , *flags;..struc
5930: 74 20 69 66 72 65 71 20 69 66 61 63 65 5f 72 65 t ifreq iface_re
5940: 71 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 q;..unsigned cha
5950: 72 20 2a 61 64 64 72 5f 64 61 74 61 3b 0a 09 63 r *addr_data;..c
5960: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 6b 5f onst char *link_
5970: 65 6e 63 61 70 3b 0a 09 63 6f 6e 73 74 20 63 68 encap;..const ch
5980: 61 72 20 2a 69 66 61 63 65 3b 0a 09 69 6e 74 20 ar *iface;..int
5990: 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 2c 20 66 flags_bitmask, f
59a0: 6c 61 67 5f 62 72 6f 61 64 63 61 73 74 20 3d 20 lag_broadcast =
59b0: 30 2c 20 66 6c 61 67 5f 70 6f 69 6e 74 6f 70 6f 0, flag_pointopo
59c0: 69 6e 74 20 3d 20 30 3b 0a 09 69 6e 74 20 69 6f int = 0;..int io
59d0: 63 74 6c 5f 72 65 74 3b 0a 0a 09 72 65 74 6c 69 ctl_ret;...retli
59e0: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 st = Tcl_NewObj(
59f0: 29 3b 0a 0a 09 69 66 61 63 65 20 3d 20 54 63 6c );...iface = Tcl
5a00: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
5a10: 31 5d 29 3b 0a 0a 09 69 66 20 28 28 73 74 72 6c 1]);...if ((strl
5a20: 65 6e 28 69 66 61 63 65 29 20 2b 20 31 29 20 3e en(iface) + 1) >
5a30: 3d 20 49 46 4e 41 4d 53 49 5a 29 20 7b 0a 09 09 = IFNAMSIZ) {...
5a40: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
5a50: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
5a60: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 74 65 72 StringObj("inter
5a70: 66 61 63 65 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f face name too lo
5a80: 6e 67 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 ng", -1));....re
5a90: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
5aa0: 0a 09 7d 0a 0a 09 73 74 72 63 70 79 28 69 66 61 ..}...strcpy(ifa
5ab0: 63 65 5f 72 65 71 2e 69 66 72 5f 6e 61 6d 65 2c ce_req.ifr_name,
5ac0: 20 69 66 61 63 65 29 3b 0a 0a 09 2f 2a 0a 09 20 iface);.../*..
5ad0: 2a 20 41 6c 6c 20 69 6e 74 65 72 66 61 63 65 73 * All interfaces
5ae0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 6c 61 should have fla
5af0: 67 73 2c 20 73 6f 20 75 73 65 20 69 74 20 61 73 gs, so use it as
5b00: 20 61 20 63 68 65 63 6b 20 66 6f 72 20 69 6e 74 a check for int
5b10: 65 72 66 61 63 65 0a 09 20 2a 20 65 78 69 73 74 erface.. * exist
5b20: 61 6e 63 65 0a 09 20 2a 2f 0a 09 69 6f 63 74 6c ance.. */..ioctl
5b30: 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63 _ret = ioctl(soc
5b40: 6b 2c 20 53 49 4f 43 47 49 46 46 4c 41 47 53 2c k, SIOCGIFFLAGS,
5b50: 20 26 69 66 61 63 65 5f 72 65 71 29 3b 0a 09 69 &iface_req);..i
5b60: 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20 f (ioctl_ret !=
5b70: 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 0) {...Tcl_SetOb
5b80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
5b90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
5ba0: 28 22 69 6e 76 61 6c 69 64 20 69 6e 74 65 72 66 ("invalid interf
5bb0: 61 63 65 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 ace", -1));....r
5bc0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
5bd0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 ;..}.../* Create
5be0: 20 6c 69 73 74 20 6f 66 20 66 6c 61 67 73 20 2a list of flags *
5bf0: 2f 0a 09 66 6c 61 67 73 20 3d 20 54 63 6c 5f 4e /..flags = Tcl_N
5c00: 65 77 4f 62 6a 28 29 3b 0a 09 66 6c 61 67 73 5f ewObj();..flags_
5c10: 62 69 74 6d 61 73 6b 20 3d 20 69 66 61 63 65 5f bitmask = iface_
5c20: 72 65 71 2e 69 66 72 5f 66 6c 61 67 73 3b 0a 0a req.ifr_flags;..
5c30: 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d .if ((flags_bitm
5c40: 61 73 6b 20 26 20 49 46 46 5f 55 50 29 20 3d 3d ask & IFF_UP) ==
5c50: 20 49 46 46 5f 55 50 29 20 7b 0a 09 09 54 63 6c IFF_UP) {...Tcl
5c60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5c70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c ement(interp, fl
5c80: 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 ags, Tcl_NewStri
5c90: 6e 67 4f 62 6a 28 22 55 50 22 2c 20 2d 31 29 29 ngObj("UP", -1))
5ca0: 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 ;..}..if ((flags
5cb0: 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 42 _bitmask & IFF_B
5cc0: 52 4f 41 44 43 41 53 54 29 20 3d 3d 20 49 46 46 ROADCAST) == IFF
5cd0: 5f 42 52 4f 41 44 43 41 53 54 29 20 7b 0a 09 09 _BROADCAST) {...
5ce0: 66 6c 61 67 5f 62 72 6f 61 64 63 61 73 74 20 3d flag_broadcast =
5cf0: 20 31 3b 0a 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 1;....Tcl_ListO
5d00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5d10: 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 interp, flags, T
5d20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5d30: 22 42 52 4f 41 44 43 41 53 54 22 2c 20 2d 31 29 "BROADCAST", -1)
5d40: 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 );..}..if ((flag
5d50: 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f s_bitmask & IFF_
5d60: 50 4f 49 4e 54 4f 50 4f 49 4e 54 29 20 3d 3d 20 POINTOPOINT) ==
5d70: 49 46 46 5f 50 4f 49 4e 54 4f 50 4f 49 4e 54 29 IFF_POINTOPOINT)
5d80: 20 7b 0a 09 09 66 6c 61 67 5f 70 6f 69 6e 74 6f {...flag_pointo
5d90: 70 6f 69 6e 74 20 3d 20 31 3b 0a 0a 09 09 54 63 point = 1;....Tc
5da0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5db0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 lement(interp, f
5dc0: 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 lags, Tcl_NewStr
5dd0: 69 6e 67 4f 62 6a 28 22 50 4f 49 4e 54 4f 50 4f ingObj("POINTOPO
5de0: 49 4e 54 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 INT", -1));..}..
5df0: 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 if ((flags_bitma
5e00: 73 6b 20 26 20 49 46 46 5f 44 45 42 55 47 29 20 sk & IFF_DEBUG)
5e10: 3d 3d 20 49 46 46 5f 44 45 42 55 47 29 20 7b 0a == IFF_DEBUG) {.
5e20: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
5e30: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5e40: 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 p, flags, Tcl_Ne
5e50: 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 45 42 55 wStringObj("DEBU
5e60: 47 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 G", -1));..}..if
5e70: 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b ((flags_bitmask
5e80: 20 26 20 49 46 46 5f 4c 4f 4f 50 42 41 43 4b 29 & IFF_LOOPBACK)
5e90: 20 3d 3d 20 49 46 46 5f 4c 4f 4f 50 42 41 43 4b == IFF_LOOPBACK
5ea0: 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 ) {...Tcl_ListOb
5eb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5ec0: 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 nterp, flags, Tc
5ed0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
5ee0: 4c 4f 4f 50 42 41 43 4b 22 2c 20 2d 31 29 29 3b LOOPBACK", -1));
5ef0: 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f ..}..if ((flags_
5f00: 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 4e 4f bitmask & IFF_NO
5f10: 54 52 41 49 4c 45 52 53 29 20 3d 3d 20 49 46 46 TRAILERS) == IFF
5f20: 5f 4e 4f 54 52 41 49 4c 45 52 53 29 20 7b 0a 09 _NOTRAILERS) {..
5f30: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
5f40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5f50: 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 , flags, Tcl_New
5f60: 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 54 52 41 StringObj("NOTRA
5f70: 49 4c 45 52 53 22 2c 20 2d 31 29 29 3b 0a 09 7d ILERS", -1));..}
5f80: 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 ..if ((flags_bit
5f90: 6d 61 73 6b 20 26 20 49 46 46 5f 52 55 4e 4e 49 mask & IFF_RUNNI
5fa0: 4e 47 29 20 3d 3d 20 49 46 46 5f 52 55 4e 4e 49 NG) == IFF_RUNNI
5fb0: 4e 47 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 NG) {...Tcl_List
5fc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5fd0: 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 (interp, flags,
5fe0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
5ff0: 28 22 52 55 4e 4e 49 4e 47 22 2c 20 2d 31 29 29 ("RUNNING", -1))
6000: 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 ;..}..if ((flags
6010: 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 4e _bitmask & IFF_N
6020: 4f 41 52 50 29 20 3d 3d 20 49 46 46 5f 4e 4f 41 OARP) == IFF_NOA
6030: 52 50 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 RP) {...Tcl_List
6040: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6050: 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 (interp, flags,
6060: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6070: 28 22 4e 4f 41 52 50 22 2c 20 2d 31 29 29 3b 0a ("NOARP", -1));.
6080: 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 .}..if ((flags_b
6090: 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 50 52 4f itmask & IFF_PRO
60a0: 4d 49 53 43 29 20 3d 3d 20 49 46 46 5f 50 52 4f MISC) == IFF_PRO
60b0: 4d 49 53 43 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 MISC) {...Tcl_Li
60c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
60d0: 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 nt(interp, flags
60e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
60f0: 62 6a 28 22 50 52 4f 4d 49 53 43 22 2c 20 2d 31 bj("PROMISC", -1
6100: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 ));..}..if ((fla
6110: 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 gs_bitmask & IFF
6120: 5f 41 4c 4c 4d 55 4c 54 49 29 20 3d 3d 20 49 46 _ALLMULTI) == IF
6130: 46 5f 41 4c 4c 4d 55 4c 54 49 29 20 7b 0a 09 09 F_ALLMULTI) {...
6140: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6150: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6160: 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 flags, Tcl_NewS
6170: 74 72 69 6e 67 4f 62 6a 28 22 41 4c 4c 4d 55 4c tringObj("ALLMUL
6180: 54 49 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 TI", -1));..}..i
6190: 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 f ((flags_bitmas
61a0: 6b 20 26 20 49 46 46 5f 4d 41 53 54 45 52 29 20 k & IFF_MASTER)
61b0: 3d 3d 20 49 46 46 5f 4d 41 53 54 45 52 29 20 7b == IFF_MASTER) {
61c0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
61d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
61e0: 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e rp, flags, Tcl_N
61f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4d 41 53 ewStringObj("MAS
6200: 54 45 52 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 TER", -1));..}..
6210: 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 if ((flags_bitma
6220: 73 6b 20 26 20 49 46 46 5f 53 4c 41 56 45 29 20 sk & IFF_SLAVE)
6230: 3d 3d 20 49 46 46 5f 53 4c 41 56 45 29 20 7b 0a == IFF_SLAVE) {.
6240: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
6250: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6260: 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 p, flags, Tcl_Ne
6270: 77 53 74 72 69 6e 67 4f 62 6a 28 22 53 4c 41 56 wStringObj("SLAV
6280: 45 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 E", -1));..}..if
6290: 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b ((flags_bitmask
62a0: 20 26 20 49 46 46 5f 4d 55 4c 54 49 43 41 53 54 & IFF_MULTICAST
62b0: 29 20 3d 3d 20 49 46 46 5f 4d 55 4c 54 49 43 41 ) == IFF_MULTICA
62c0: 53 54 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 ST) {...Tcl_List
62d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
62e0: 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 (interp, flags,
62f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6300: 28 22 4d 55 4c 54 49 43 41 53 54 22 2c 20 2d 31 ("MULTICAST", -1
6310: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 ));..}..if ((fla
6320: 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 gs_bitmask & IFF
6330: 5f 50 4f 52 54 53 45 4c 29 20 3d 3d 20 49 46 46 _PORTSEL) == IFF
6340: 5f 50 4f 52 54 53 45 4c 29 20 7b 0a 09 09 54 63 _PORTSEL) {...Tc
6350: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
6360: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 lement(interp, f
6370: 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 lags, Tcl_NewStr
6380: 69 6e 67 4f 62 6a 28 22 50 4f 52 54 53 45 4c 22 ingObj("PORTSEL"
6390: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
63a0: 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 (flags_bitmask &
63b0: 20 49 46 46 5f 41 55 54 4f 4d 45 44 49 41 29 20 IFF_AUTOMEDIA)
63c0: 3d 3d 20 49 46 46 5f 41 55 54 4f 4d 45 44 49 41 == IFF_AUTOMEDIA
63d0: 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 ) {...Tcl_ListOb
63e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
63f0: 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 nterp, flags, Tc
6400: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
6410: 41 55 54 4f 4d 45 44 49 41 22 2c 20 2d 31 29 29 AUTOMEDIA", -1))
6420: 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 ;..}..if ((flags
6430: 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 44 _bitmask & IFF_D
6440: 59 4e 41 4d 49 43 29 20 3d 3d 20 49 46 46 5f 44 YNAMIC) == IFF_D
6450: 59 4e 41 4d 49 43 29 20 7b 0a 09 09 54 63 6c 5f YNAMIC) {...Tcl_
6460: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6470: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 ment(interp, fla
6480: 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e gs, Tcl_NewStrin
6490: 67 4f 62 6a 28 22 44 59 4e 41 4d 49 43 22 2c 20 gObj("DYNAMIC",
64a0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 -1));..}..if ((f
64b0: 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 lags_bitmask & I
64c0: 46 46 5f 4c 4f 57 45 52 5f 55 50 29 20 3d 3d 20 FF_LOWER_UP) ==
64d0: 49 46 46 5f 4c 4f 57 45 52 5f 55 50 29 20 7b 0a IFF_LOWER_UP) {.
64e0: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
64f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6500: 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 p, flags, Tcl_Ne
6510: 77 53 74 72 69 6e 67 4f 62 6a 28 22 4c 4f 57 45 wStringObj("LOWE
6520: 52 5f 55 50 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a R_UP", -1));..}.
6530: 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d .if ((flags_bitm
6540: 61 73 6b 20 26 20 49 46 46 5f 44 4f 52 4d 41 4e ask & IFF_DORMAN
6550: 54 29 20 3d 3d 20 49 46 46 5f 44 4f 52 4d 41 4e T) == IFF_DORMAN
6560: 54 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f T) {...Tcl_ListO
6570: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6580: 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 interp, flags, T
6590: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
65a0: 22 44 4f 52 4d 41 4e 54 22 2c 20 2d 31 29 29 3b "DORMANT", -1));
65b0: 0a 09 7d 0a 23 69 66 64 65 66 20 49 46 46 5f 45 ..}.#ifdef IFF_E
65c0: 43 48 4f 0a 09 69 66 20 28 28 66 6c 61 67 73 5f CHO..if ((flags_
65d0: 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 45 43 bitmask & IFF_EC
65e0: 48 4f 29 20 3d 3d 20 49 46 46 5f 45 43 48 4f 29 HO) == IFF_ECHO)
65f0: 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a {...Tcl_ListObj
6600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6610: 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c terp, flags, Tcl
6620: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 45 _NewStringObj("E
6630: 43 48 4f 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 23 CHO", -1));..}.#
6640: 65 6e 64 69 66 0a 0a 09 2f 2a 20 41 64 64 20 61 endif.../* Add a
6650: 72 72 61 79 2d 63 6f 6d 70 6c 69 61 6e 74 2f 64 rray-compliant/d
6660: 69 63 74 20 65 6e 74 72 79 20 74 6f 20 74 68 65 ict entry to the
6670: 20 72 65 74 75 72 6e 20 6c 69 73 74 20 2a 2f 0a return list */.
6680: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
6690: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
66a0: 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e , retlist, Tcl_N
66b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 6c 61 ewStringObj("fla
66c0: 67 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f gs", -1));..Tcl_
66d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
66e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 74 ment(interp, ret
66f0: 6c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 0a 09 list, flags);...
6700: 2f 2a 20 46 65 74 63 68 20 6f 74 68 65 72 20 61 /* Fetch other a
6710: 74 74 72 69 62 75 74 65 73 20 66 72 6f 6d 20 74 ttributes from t
6720: 68 65 20 69 6e 74 65 72 66 61 63 65 20 2a 2f 0a he interface */.
6730: 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 .ioctl_ret = ioc
6740: 74 6c 28 73 6f 63 6b 2c 20 53 49 4f 43 47 49 46 tl(sock, SIOCGIF
6750: 48 57 41 44 44 52 2c 20 26 69 66 61 63 65 5f 72 HWADDR, &iface_r
6760: 65 71 29 3b 0a 09 69 66 20 28 69 6f 63 74 6c 5f eq);..if (ioctl_
6770: 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09 6c 69 ret == 0) {...li
6780: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 75 6e 6b 6e nk_encap = "unkn
6790: 6f 77 6e 22 3b 0a 0a 09 09 61 64 64 72 5f 64 61 own";....addr_da
67a0: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 ta = (unsigned c
67b0: 68 61 72 20 2a 29 20 69 66 61 63 65 5f 72 65 71 har *) iface_req
67c0: 2e 69 66 72 5f 68 77 61 64 64 72 2e 73 61 5f 64 .ifr_hwaddr.sa_d
67d0: 61 74 61 3b 0a 09 09 73 77 69 74 63 68 20 28 69 ata;...switch (i
67e0: 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 68 77 61 face_req.ifr_hwa
67f0: 64 64 72 2e 73 61 5f 66 61 6d 69 6c 79 29 20 7b ddr.sa_family) {
6800: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f ....case ARPHRD_
6810: 45 54 48 45 52 3a 0a 09 09 09 09 6c 69 6e 6b 5f ETHER:.....link_
6820: 65 6e 63 61 70 20 3d 20 22 65 74 68 65 72 6e 65 encap = "etherne
6830: 74 22 3b 0a 0a 09 09 09 09 54 63 6c 5f 4c 69 73 t";......Tcl_Lis
6840: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6850: 74 28 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 t(interp, retlis
6860: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 t, Tcl_NewString
6870: 4f 62 6a 28 22 68 77 61 64 64 72 22 2c 20 2d 31 Obj("hwaddr", -1
6880: 29 29 3b 0a 09 09 09 09 54 63 6c 5f 4c 69 73 74 ));.....Tcl_List
6890: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
68a0: 28 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 (interp, retlist
68b0: 2c 0a 09 09 09 09 20 20 54 63 6c 5f 4f 62 6a 50 ,..... Tcl_ObjP
68c0: 72 69 6e 74 66 28 22 25 30 32 78 3a 25 30 32 78 rintf("%02x:%02x
68d0: 3a 25 30 32 78 3a 25 30 32 78 3a 25 30 32 78 3a :%02x:%02x:%02x:
68e0: 25 30 32 78 22 2c 0a 09 09 09 09 20 20 20 20 61 %02x",..... a
68f0: 64 64 72 5f 64 61 74 61 5b 30 5d 2c 0a 09 09 09 ddr_data[0],....
6900: 09 20 20 20 20 61 64 64 72 5f 64 61 74 61 5b 31 . addr_data[1
6910: 5d 2c 0a 09 09 09 09 20 20 20 20 61 64 64 72 5f ],..... addr_
6920: 64 61 74 61 5b 32 5d 2c 0a 09 09 09 09 20 20 20 data[2],.....
6930: 20 61 64 64 72 5f 64 61 74 61 5b 33 5d 2c 0a 09 addr_data[3],..
6940: 09 09 09 20 20 20 20 61 64 64 72 5f 64 61 74 61 ... addr_data
6950: 5b 34 5d 2c 0a 09 09 09 09 20 20 20 20 61 64 64 [4],..... add
6960: 72 5f 64 61 74 61 5b 35 5d 0a 09 09 09 09 20 20 r_data[5].....
6970: 29 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09 62 72 ).....);......br
6980: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 eak;....case ARP
6990: 48 52 44 5f 41 58 32 35 3a 0a 09 09 09 09 6c 69 HRD_AX25:.....li
69a0: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 61 78 32 35 nk_encap = "ax25
69b0: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ";.....break;...
69c0: 09 63 61 73 65 20 41 52 50 48 52 44 5f 50 52 4f .case ARPHRD_PRO
69d0: 4e 45 54 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e NET:.....link_en
69e0: 63 61 70 20 3d 20 22 70 72 6f 6e 65 74 22 3b 0a cap = "pronet";.
69f0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
6a00: 73 65 20 41 52 50 48 52 44 5f 43 48 41 4f 53 3a se ARPHRD_CHAOS:
6a10: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 .....link_encap
6a20: 3d 20 22 63 68 61 6f 73 22 3b 0a 09 09 09 09 62 = "chaos";.....b
6a30: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 reak;....case AR
6a40: 50 48 52 44 5f 49 45 45 45 38 30 32 3a 0a 09 09 PHRD_IEEE802:...
6a50: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 ..link_encap = "
6a60: 69 65 65 65 38 30 32 22 3b 0a 09 09 09 09 62 72 ieee802";.....br
6a70: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 eak;....case ARP
6a80: 48 52 44 5f 41 52 43 4e 45 54 3a 0a 09 09 09 09 HRD_ARCNET:.....
6a90: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 61 72 link_encap = "ar
6aa0: 63 6e 65 74 22 3b 0a 09 09 09 09 62 72 65 61 6b cnet";.....break
6ab0: 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 ;....case ARPHRD
6ac0: 5f 41 50 50 4c 45 54 4c 4b 3a 0a 09 09 09 09 6c _APPLETLK:.....l
6ad0: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 61 70 70 ink_encap = "app
6ae0: 6c 65 74 6c 6b 22 3b 0a 09 09 09 09 62 72 65 61 letlk";.....brea
6af0: 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 k;....case ARPHR
6b00: 44 5f 44 4c 43 49 3a 0a 09 09 09 09 6c 69 6e 6b D_DLCI:.....link
6b10: 5f 65 6e 63 61 70 20 3d 20 22 64 6c 63 69 22 3b _encap = "dlci";
6b20: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
6b30: 61 73 65 20 41 52 50 48 52 44 5f 41 54 4d 3a 0a ase ARPHRD_ATM:.
6b40: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d ....link_encap =
6b50: 20 22 61 74 6d 22 3b 0a 09 09 09 09 62 72 65 61 "atm";.....brea
6b60: 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 k;....case ARPHR
6b70: 44 5f 4d 45 54 52 49 43 4f 4d 3a 0a 09 09 09 09 D_METRICOM:.....
6b80: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 6d 65 link_encap = "me
6b90: 74 72 69 63 6f 6d 22 3b 0a 09 09 09 09 62 72 65 tricom";.....bre
6ba0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 ak;....case ARPH
6bb0: 52 44 5f 49 45 45 45 31 33 39 34 3a 0a 09 09 09 RD_IEEE1394:....
6bc0: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 69 .link_encap = "i
6bd0: 65 65 65 31 33 39 34 22 3b 0a 09 09 09 09 62 72 eee1394";.....br
6be0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 eak;....case ARP
6bf0: 48 52 44 5f 45 55 49 36 34 3a 0a 09 09 09 09 6c HRD_EUI64:.....l
6c00: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 65 75 69 ink_encap = "eui
6c10: 36 34 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 64";.....break;.
6c20: 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 49 ...case ARPHRD_I
6c30: 4e 46 49 4e 49 42 41 4e 44 3a 0a 09 09 09 09 6c NFINIBAND:.....l
6c40: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 69 6e 66 ink_encap = "inf
6c50: 69 6e 69 62 61 6e 64 22 3b 0a 09 09 09 09 62 72 iniband";.....br
6c60: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 eak;....case ARP
6c70: 48 52 44 5f 53 4c 49 50 3a 0a 09 09 09 09 6c 69 HRD_SLIP:.....li
6c80: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 73 6c 69 70 nk_encap = "slip
6c90: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ";.....break;...
6ca0: 09 63 61 73 65 20 41 52 50 48 52 44 5f 43 53 4c .case ARPHRD_CSL
6cb0: 49 50 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 IP:.....link_enc
6cc0: 61 70 20 3d 20 22 63 73 6c 69 70 22 3b 0a 09 09 ap = "cslip";...
6cd0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
6ce0: 20 41 52 50 48 52 44 5f 53 4c 49 50 36 3a 0a 09 ARPHRD_SLIP6:..
6cf0: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 ...link_encap =
6d00: 22 73 6c 69 70 36 22 3b 0a 09 09 09 09 62 72 65 "slip6";.....bre
6d10: 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 ak;....case ARPH
6d20: 52 44 5f 43 53 4c 49 50 36 3a 0a 09 09 09 09 6c RD_CSLIP6:.....l
6d30: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 63 73 6c ink_encap = "csl
6d40: 69 70 36 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b ip6";.....break;
6d50: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f ....case ARPHRD_
6d60: 52 53 52 56 44 3a 0a 09 09 09 09 6c 69 6e 6b 5f RSRVD:.....link_
6d70: 65 6e 63 61 70 20 3d 20 22 72 73 72 76 64 22 3b encap = "rsrvd";
6d80: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
6d90: 61 73 65 20 41 52 50 48 52 44 5f 41 44 41 50 54 ase ARPHRD_ADAPT
6da0: 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 :.....link_encap
6db0: 20 3d 20 22 61 64 61 70 74 22 3b 0a 09 09 09 09 = "adapt";.....
6dc0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 break;....case A
6dd0: 52 50 48 52 44 5f 52 4f 53 45 3a 0a 09 09 09 09 RPHRD_ROSE:.....
6de0: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 72 6f link_encap = "ro
6df0: 73 65 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a se";.....break;.
6e00: 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 58 ...case ARPHRD_X
6e10: 32 35 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 25:.....link_enc
6e20: 61 70 20 3d 20 22 78 32 35 22 3b 0a 09 09 09 09 ap = "x25";.....
6e30: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 break;....case A
6e40: 52 50 48 52 44 5f 48 57 58 32 35 3a 0a 09 09 09 RPHRD_HWX25:....
6e50: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 68 .link_encap = "h
6e60: 77 78 32 35 22 3b 0a 09 09 09 09 62 72 65 61 6b wx25";.....break
6e70: 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 ;....case ARPHRD
6e80: 5f 43 41 4e 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 _CAN:.....link_e
6e90: 6e 63 61 70 20 3d 20 22 63 61 6e 22 3b 0a 09 09 ncap = "can";...
6ea0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
6eb0: 20 41 52 50 48 52 44 5f 50 50 50 3a 0a 09 09 09 ARPHRD_PPP:....
6ec0: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 70 .link_encap = "p
6ed0: 70 70 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a pp";.....break;.
6ee0: 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 43 ...case ARPHRD_C
6ef0: 49 53 43 4f 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 ISCO:.....link_e
6f00: 6e 63 61 70 20 3d 20 22 63 69 73 63 6f 22 3b 0a ncap = "cisco";.
6f10: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
6f20: 73 65 20 41 52 50 48 52 44 5f 4c 41 50 42 3a 0a se ARPHRD_LAPB:.
6f30: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d ....link_encap =
6f40: 20 22 6c 61 70 62 22 3b 0a 09 09 09 09 62 72 65 "lapb";.....bre
6f50: 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 ak;....case ARPH
6f60: 52 44 5f 44 44 43 4d 50 3a 0a 09 09 09 09 6c 69 RD_DDCMP:.....li
6f70: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 64 64 63 6d nk_encap = "ddcm
6f80: 70 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 p";.....break;..
6f90: 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 52 41 ..case ARPHRD_RA
6fa0: 57 48 44 4c 43 3a 0a 09 09 09 09 6c 69 6e 6b 5f WHDLC:.....link_
6fb0: 65 6e 63 61 70 20 3d 20 22 72 61 77 68 64 6c 63 encap = "rawhdlc
6fc0: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ";.....break;...
6fd0: 09 63 61 73 65 20 41 52 50 48 52 44 5f 54 55 4e .case ARPHRD_TUN
6fe0: 4e 45 4c 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e NEL:.....link_en
6ff0: 63 61 70 20 3d 20 22 74 75 6e 6e 65 6c 22 3b 0a cap = "tunnel";.
7000: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
7010: 73 65 20 41 52 50 48 52 44 5f 54 55 4e 4e 45 4c se ARPHRD_TUNNEL
7020: 36 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 6:.....link_enca
7030: 70 20 3d 20 22 74 75 6e 6e 65 6c 36 22 3b 0a 09 p = "tunnel6";..
7040: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
7050: 65 20 41 52 50 48 52 44 5f 46 52 41 44 3a 0a 09 e ARPHRD_FRAD:..
7060: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 ...link_encap =
7070: 22 66 72 61 64 22 3b 0a 09 09 09 09 62 72 65 61 "frad";.....brea
7080: 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 k;....case ARPHR
7090: 44 5f 53 4b 49 50 3a 0a 09 09 09 09 6c 69 6e 6b D_SKIP:.....link
70a0: 5f 65 6e 63 61 70 20 3d 20 22 73 6b 69 70 22 3b _encap = "skip";
70b0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
70c0: 61 73 65 20 41 52 50 48 52 44 5f 4c 4f 4f 50 42 ase ARPHRD_LOOPB
70d0: 41 43 4b 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e ACK:.....link_en
70e0: 63 61 70 20 3d 20 22 6c 6f 6f 70 62 61 63 6b 22 cap = "loopback"
70f0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ;.....break;....
7100: 63 61 73 65 20 41 52 50 48 52 44 5f 4c 4f 43 41 case ARPHRD_LOCA
7110: 4c 54 4c 4b 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 LTLK:.....link_e
7120: 6e 63 61 70 20 3d 20 22 6c 6f 63 61 6c 74 61 6c ncap = "localtal
7130: 6b 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 k";.....break;..
7140: 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 46 44 ..case ARPHRD_FD
7150: 44 49 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 DI:.....link_enc
7160: 61 70 20 3d 20 22 66 64 64 69 22 3b 0a 09 09 09 ap = "fddi";....
7170: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
7180: 41 52 50 48 52 44 5f 42 49 46 3a 0a 09 09 09 09 ARPHRD_BIF:.....
7190: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 62 69 link_encap = "bi
71a0: 66 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 f";.....break;..
71b0: 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 53 49 ..case ARPHRD_SI
71c0: 54 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 T:.....link_enca
71d0: 70 20 3d 20 22 73 69 74 22 3b 0a 09 09 09 09 62 p = "sit";.....b
71e0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 reak;....case AR
71f0: 50 48 52 44 5f 49 50 44 44 50 3a 0a 09 09 09 09 PHRD_IPDDP:.....
7200: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 69 70 link_encap = "ip
7210: 64 64 70 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b ddp";.....break;
7220: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f ....case ARPHRD_
7230: 49 50 47 52 45 3a 0a 09 09 09 09 6c 69 6e 6b 5f IPGRE:.....link_
7240: 65 6e 63 61 70 20 3d 20 22 67 72 65 22 3b 0a 09 encap = "gre";..
7250: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
7260: 65 20 41 52 50 48 52 44 5f 50 49 4d 52 45 47 3a e ARPHRD_PIMREG:
7270: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 .....link_encap
7280: 3d 20 22 70 69 6d 72 65 67 22 3b 0a 09 09 09 09 = "pimreg";.....
7290: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 break;....case A
72a0: 52 50 48 52 44 5f 48 49 50 50 49 3a 0a 09 09 09 RPHRD_HIPPI:....
72b0: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 68 .link_encap = "h
72c0: 69 70 70 69 22 3b 0a 09 09 09 09 62 72 65 61 6b ippi";.....break
72d0: 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 ;....case ARPHRD
72e0: 5f 41 53 48 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 _ASH:.....link_e
72f0: 6e 63 61 70 20 3d 20 22 61 73 68 22 3b 0a 09 09 ncap = "ash";...
7300: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
7310: 20 41 52 50 48 52 44 5f 45 43 4f 4e 45 54 3a 0a ARPHRD_ECONET:.
7320: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d ....link_encap =
7330: 20 22 65 63 6f 6e 65 74 22 3b 0a 09 09 09 09 62 "econet";.....b
7340: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 reak;....case AR
7350: 50 48 52 44 5f 49 52 44 41 3a 0a 09 09 09 09 6c PHRD_IRDA:.....l
7360: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 69 72 64 ink_encap = "ird
7370: 61 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 a";.....break;..
7380: 09 7d 0a 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 .}....Tcl_ListOb
7390: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
73a0: 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 nterp, retlist,
73b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
73c0: 28 22 6c 69 6e 6b 5f 65 6e 63 61 70 22 2c 20 2d ("link_encap", -
73d0: 31 29 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 1));...Tcl_ListO
73e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
73f0: 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c interp, retlist,
7400: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7410: 6a 28 6c 69 6e 6b 5f 65 6e 63 61 70 2c 20 2d 31 j(link_encap, -1
7420: 29 29 3b 0a 09 7d 0a 0a 09 69 6f 63 74 6c 5f 72 ));..}...ioctl_r
7430: 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c et = ioctl(sock,
7440: 20 53 49 4f 43 47 49 46 4d 45 54 52 49 43 2c 20 SIOCGIFMETRIC,
7450: 26 69 66 61 63 65 5f 72 65 71 29 3b 0a 09 69 66 &iface_req);..if
7460: 20 28 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 (ioctl_ret == 0
7470: 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 ) {...Tcl_ListOb
7480: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
7490: 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 nterp, retlist,
74a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
74b0: 28 22 6d 65 74 72 69 63 22 2c 20 2d 31 29 29 3b ("metric", -1));
74c0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
74d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
74e0: 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c rp, retlist, Tcl
74f0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 _NewWideIntObj(i
7500: 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 6d 65 74 face_req.ifr_met
7510: 72 69 63 20 2b 20 31 29 29 3b 0a 09 7d 0a 0a 09 ric + 1));..}...
7520: 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 ioctl_ret = ioct
7530: 6c 28 73 6f 63 6b 2c 20 53 49 4f 43 47 49 46 4d l(sock, SIOCGIFM
7540: 54 55 2c 20 26 69 66 61 63 65 5f 72 65 71 29 3b TU, &iface_req);
7550: 0a 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 ..if (ioctl_ret
7560: 3d 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 == 0) {...Tcl_Li
7570: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
7580: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 nt(interp, retli
7590: 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e st, Tcl_NewStrin
75a0: 67 4f 62 6a 28 22 6d 74 75 22 2c 20 2d 31 29 29 gObj("mtu", -1))
75b0: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
75c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
75d0: 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 erp, retlist, Tc
75e0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 l_NewWideIntObj(
75f0: 69 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 6d 74 iface_req.ifr_mt
7600: 75 29 29 3b 0a 09 7d 0a 0a 09 69 6f 63 74 6c 5f u));..}...ioctl_
7610: 72 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b ret = ioctl(sock
7620: 2c 20 53 49 4f 43 47 49 46 49 4e 44 45 58 2c 20 , SIOCGIFINDEX,
7630: 26 69 66 61 63 65 5f 72 65 71 29 3b 0a 09 69 66 &iface_req);..if
7640: 20 28 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 (ioctl_ret == 0
7650: 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 ) {...Tcl_ListOb
7660: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
7670: 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 nterp, retlist,
7680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7690: 28 22 69 6e 64 65 78 22 2c 20 2d 31 29 29 3b 0a ("index", -1));.
76a0: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
76b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
76c0: 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f p, retlist, Tcl_
76d0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 66 NewWideIntObj(if
76e0: 61 63 65 5f 72 65 71 2e 69 66 72 5f 69 66 69 6e ace_req.ifr_ifin
76f0: 64 65 78 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 dex));..}...if (
7700: 73 6f 63 6b 5f 76 34 20 21 3d 20 2d 31 29 20 7b sock_v4 != -1) {
7710: 0a 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 ...ioctl_ret = i
7720: 6f 63 74 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49 octl(sock_v4, SI
7730: 4f 43 47 49 46 41 44 44 52 2c 20 26 69 66 61 63 OCGIFADDR, &ifac
7740: 65 5f 72 65 71 29 3b 0a 09 09 69 66 20 28 69 6f e_req);...if (io
7750: 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a ctl_ret == 0) {.
7760: 09 09 09 74 63 6c 73 79 73 74 65 6d 5f 70 72 69 ...tclsystem_pri
7770: 76 61 74 65 5f 61 70 70 65 6e 64 5f 73 6f 63 6b vate_append_sock
7780: 61 64 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a 28 69 addr_to_tclobj(i
7790: 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 nterp, retlist,
77a0: 22 61 64 64 72 65 73 73 22 2c 20 26 69 66 61 63 "address", &ifac
77b0: 65 5f 72 65 71 2e 69 66 72 5f 61 64 64 72 29 3b e_req.ifr_addr);
77c0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 66 6c 61 67 ...}....if (flag
77d0: 5f 70 6f 69 6e 74 6f 70 6f 69 6e 74 29 20 7b 0a _pointopoint) {.
77e0: 09 09 09 2f 2a 20 50 6f 69 6e 74 2d 74 6f 2d 50 .../* Point-to-P
77f0: 6f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 73 20 oint interfaces
7800: 2a 2f 0a 09 09 09 69 6f 63 74 6c 5f 72 65 74 20 */....ioctl_ret
7810: 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 5f 76 34 2c = ioctl(sock_v4,
7820: 20 53 49 4f 43 47 49 46 44 53 54 41 44 44 52 2c SIOCGIFDSTADDR,
7830: 20 26 69 66 61 63 65 5f 72 65 71 29 3b 0a 09 09 &iface_req);...
7840: 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 3d .if (ioctl_ret =
7850: 3d 20 30 29 20 7b 0a 09 09 09 09 74 63 6c 73 79 = 0) {.....tclsy
7860: 73 74 65 6d 5f 70 72 69 76 61 74 65 5f 61 70 70 stem_private_app
7870: 65 6e 64 5f 73 6f 63 6b 61 64 64 72 5f 74 6f 5f end_sockaddr_to_
7880: 74 63 6c 6f 62 6a 28 69 6e 74 65 72 70 2c 20 72 tclobj(interp, r
7890: 65 74 6c 69 73 74 2c 20 22 64 65 73 74 69 6e 61 etlist, "destina
78a0: 74 69 6f 6e 22 2c 20 26 69 66 61 63 65 5f 72 65 tion", &iface_re
78b0: 71 2e 69 66 72 5f 61 64 64 72 29 3b 0a 09 09 09 q.ifr_addr);....
78c0: 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 66 6c 61 }...}....if (fla
78d0: 67 5f 62 72 6f 61 64 63 61 73 74 29 20 7b 0a 09 g_broadcast) {..
78e0: 09 09 2f 2a 20 42 72 6f 61 64 63 61 73 74 20 69 ../* Broadcast i
78f0: 6e 74 65 72 66 61 63 65 73 20 2a 2f 0a 09 09 09 nterfaces */....
7900: 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 ioctl_ret = ioct
7910: 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49 4f 43 47 l(sock_v4, SIOCG
7920: 49 46 42 52 44 41 44 44 52 2c 20 26 69 66 61 63 IFBRDADDR, &ifac
7930: 65 5f 72 65 71 29 3b 0a 09 09 09 69 66 20 28 69 e_req);....if (i
7940: 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b octl_ret == 0) {
7950: 0a 09 09 09 09 74 63 6c 73 79 73 74 65 6d 5f 70 .....tclsystem_p
7960: 72 69 76 61 74 65 5f 61 70 70 65 6e 64 5f 73 6f rivate_append_so
7970: 63 6b 61 64 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a ckaddr_to_tclobj
7980: 28 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 (interp, retlist
7990: 2c 20 22 62 72 6f 61 64 63 61 73 74 22 2c 20 26 , "broadcast", &
79a0: 69 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 61 64 iface_req.ifr_ad
79b0: 64 72 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 dr);....}...}...
79c0: 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 .ioctl_ret = ioc
79d0: 74 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49 4f 43 tl(sock_v4, SIOC
79e0: 47 49 46 4e 45 54 4d 41 53 4b 2c 20 26 69 66 61 GIFNETMASK, &ifa
79f0: 63 65 5f 72 65 71 29 3b 0a 09 09 69 66 20 28 69 ce_req);...if (i
7a00: 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b octl_ret == 0) {
7a10: 0a 09 09 09 74 63 6c 73 79 73 74 65 6d 5f 70 72 ....tclsystem_pr
7a20: 69 76 61 74 65 5f 61 70 70 65 6e 64 5f 73 6f 63 ivate_append_soc
7a30: 6b 61 64 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a 28 kaddr_to_tclobj(
7a40: 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c interp, retlist,
7a50: 20 22 6e 65 74 6d 61 73 6b 22 2c 20 26 69 66 61 "netmask", &ifa
7a60: 63 65 5f 72 65 71 2e 69 66 72 5f 61 64 64 72 29 ce_req.ifr_addr)
7a70: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 54 63 6c 5f 53 ;...}..}...Tcl_S
7a80: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
7a90: 72 70 2c 20 72 65 74 6c 69 73 74 29 3b 0a 0a 09 rp, retlist);...
7aa0: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
7ab0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 }..static int tc
7ac0: 6c 73 79 73 74 65 6d 5f 69 66 63 6f 6e 66 69 67 lsystem_ifconfig
7ad0: 5f 63 6f 6e 66 28 43 6c 69 65 6e 74 44 61 74 61 _conf(ClientData
7ae0: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 cd, Tcl_Interp
7af0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
7b00: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 c, Tcl_Obj *CONS
7b10: 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73 6f T objv[], int so
7b20: 63 6b 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 34 2c ck, int sock_v4,
7b30: 20 69 6e 74 20 73 6f 63 6b 5f 76 36 29 20 7b 0a int sock_v6) {.
7b40: 09 54 63 6c 5f 4f 62 6a 20 2a 6f 70 74 69 6f 6e .Tcl_Obj *option
7b50: 5f 6e 61 6d 65 5f 6f 62 6a 2c 20 2a 6f 70 74 69 _name_obj, *opti
7b60: 6f 6e 5f 76 61 6c 5f 6f 62 6a 3b 0a 09 54 63 6c on_val_obj;..Tcl
7b70: 5f 4f 62 6a 20 2a 2a 66 6c 61 67 73 5f 6f 62 6a _Obj **flags_obj
7b80: 76 3b 0a 09 73 74 72 75 63 74 20 69 66 72 65 71 v;..struct ifreq
7b90: 20 69 66 61 63 65 5f 72 65 71 3b 0a 09 73 74 72 iface_req;..str
7ba0: 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 74 6d uct sockaddr *tm
7bb0: 70 5f 69 6f 63 74 6c 5f 61 64 64 72 3b 0a 09 63 p_ioctl_addr;..c
7bc0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 66 61 63 65 onst char *iface
7bd0: 3b 0a 09 73 68 6f 72 74 20 66 6c 61 67 73 3b 0a ;..short flags;.
7be0: 09 69 6e 74 20 66 6c 61 67 73 5f 6f 62 6a 63 3b .int flags_objc;
7bf0: 0a 09 69 6e 74 20 74 6d 70 5f 73 6f 63 6b 2c 20 ..int tmp_sock,
7c00: 74 6d 70 5f 69 6f 63 74 6c 3b 0a 09 69 6e 74 20 tmp_ioctl;..int
7c10: 69 6f 63 74 6c 5f 72 65 74 2c 20 74 63 6c 5f 72 ioctl_ret, tcl_r
7c20: 65 74 2c 20 70 61 72 73 65 5f 72 65 74 3b 0a 0a et, parse_ret;..
7c30: 09 69 66 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 .iface = Tcl_Get
7c40: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b String(objv[1]);
7c50: 0a 0a 09 69 66 20 28 28 73 74 72 6c 65 6e 28 69 ...if ((strlen(i
7c60: 66 61 63 65 29 20 2b 20 31 29 20 3e 3d 20 49 46 face) + 1) >= IF
7c70: 4e 41 4d 53 49 5a 29 20 7b 0a 09 09 54 63 6c 5f NAMSIZ) {...Tcl_
7c80: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
7c90: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
7ca0: 6e 67 4f 62 6a 28 22 69 6e 74 65 72 66 61 63 65 ngObj("interface
7cb0: 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c name too long",
7cc0: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e -1));....return
7cd0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a (TCL_ERROR);..}.
7ce0: 0a 09 6f 62 6a 63 20 2d 3d 20 32 3b 0a 09 6f 62 ..objc -= 2;..ob
7cf0: 6a 76 20 2b 3d 20 32 3b 0a 0a 09 66 6f 72 20 28 jv += 2;...for (
7d00: 3b 20 6f 62 6a 63 20 3e 20 30 3b 20 6f 62 6a 63 ; objc > 0; objc
7d10: 2d 2d 2c 6f 62 6a 76 2b 2b 29 20 7b 0a 09 09 2f --,objv++) {.../
7d20: 2a 20 50 72 65 70 61 72 65 20 66 6f 72 20 61 6e * Prepare for an
7d30: 20 69 6f 63 74 6c 28 29 20 2a 2f 0a 09 09 73 74 ioctl() */...st
7d40: 72 63 70 79 28 69 66 61 63 65 5f 72 65 71 2e 69 rcpy(iface_req.i
7d50: 66 72 5f 6e 61 6d 65 2c 20 69 66 61 63 65 29 3b fr_name, iface);
7d60: 0a 09 09 74 6d 70 5f 69 6f 63 74 6c 20 3d 20 2d ...tmp_ioctl = -
7d70: 31 3b 0a 0a 09 09 6f 70 74 69 6f 6e 5f 6e 61 6d 1;....option_nam
7d80: 65 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 30 5d 3b e_obj = objv[0];
7d90: 0a 0a 09 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 ....if (objc ==
7da0: 31 29 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 4f 1) {....Tcl_SetO
7db0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
7dc0: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 Tcl_ObjPrintf("
7dd0: 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 72 65 option \"%s\" re
7de0: 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 quires an argume
7df0: 6e 74 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 nt", Tcl_GetStri
7e00: 6e 67 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f ng(option_name_o
7e10: 62 6a 29 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 bj)));.....retur
7e20: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 n(TCL_ERROR);...
7e30: 7d 0a 0a 09 09 6f 62 6a 63 2d 2d 3b 0a 09 09 6f }....objc--;...o
7e40: 62 6a 76 2b 2b 3b 0a 0a 09 09 6f 70 74 69 6f 6e bjv++;....option
7e50: 5f 76 61 6c 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b _val_obj = objv[
7e60: 30 5d 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 74 0];....switch (t
7e70: 63 6c 73 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 clsystem_interna
7e80: 6c 5f 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a l_simplehash_obj
7e90: 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a (option_name_obj
7ea0: 29 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 36 )) {....case 0x6
7eb0: 64 39 38 37 30 66 33 3a 20 2f 2a 20 66 6c 61 67 d9870f3: /* flag
7ec0: 73 20 2a 2f 0a 09 09 09 09 66 6c 61 67 73 20 3d s */.....flags =
7ed0: 20 30 3b 0a 0a 09 09 09 09 74 63 6c 5f 72 65 74 0;......tcl_ret
7ee0: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 = Tcl_ListObjGe
7ef0: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
7f00: 2c 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a , option_val_obj
7f10: 2c 20 26 66 6c 61 67 73 5f 6f 62 6a 63 2c 20 26 , &flags_objc, &
7f20: 66 6c 61 67 73 5f 6f 62 6a 76 29 3b 0a 09 09 09 flags_objv);....
7f30: 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 .if (tcl_ret !=
7f40: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 72 TCL_OK) {......r
7f50: 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a eturn(tcl_ret);.
7f60: 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28 ....}......for (
7f70: 3b 20 66 6c 61 67 73 5f 6f 62 6a 63 20 3e 20 30 ; flags_objc > 0
7f80: 3b 20 66 6c 61 67 73 5f 6f 62 6a 63 2d 2d 2c 66 ; flags_objc--,f
7f90: 6c 61 67 73 5f 6f 62 6a 76 2b 2b 29 20 7b 0a 09 lags_objv++) {..
7fa0: 09 09 09 09 73 77 69 74 63 68 20 28 74 63 6c 73 ....switch (tcls
7fb0: 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 ystem_internal_s
7fc0: 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 66 6c implehash_obj(fl
7fd0: 61 67 73 5f 6f 62 6a 76 5b 30 5d 29 29 20 7b 0a ags_objv[0])) {.
7fe0: 09 09 09 09 09 09 63 61 73 65 20 30 78 32 61 64 ......case 0x2ad
7ff0: 30 3a 20 2f 2a 20 55 50 20 2a 2f 0a 09 09 09 09 0: /* UP */.....
8000: 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 46 46 5f ...flags |= IFF_
8010: 55 50 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b UP;........break
8020: 3b 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 31 ;.......case 0x1
8030: 61 65 66 37 66 35 34 3a 20 2f 2a 20 42 52 4f 41 aef7f54: /* BROA
8040: 44 43 41 53 54 20 2a 2f 0a 09 09 09 09 09 09 09 DCAST */........
8050: 66 6c 61 67 73 20 7c 3d 20 49 46 46 5f 42 52 4f flags |= IFF_BRO
8060: 41 44 43 41 53 54 3b 0a 09 09 09 09 09 09 09 62 ADCAST;........b
8070: 72 65 61 6b 3b 0a 09 09 09 09 09 09 63 61 73 65 reak;.......case
8080: 20 30 78 63 32 35 32 61 62 64 34 3a 20 2f 2a 20 0xc252abd4: /*
8090: 50 4f 49 4e 54 4f 50 4f 49 4e 54 20 2a 2f 0a 09 POINTOPOINT */..
80a0: 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 ......flags |= I
80b0: 46 46 5f 50 4f 49 4e 54 4f 50 4f 49 4e 54 3b 0a FF_POINTOPOINT;.
80c0: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
80d0: 09 09 09 09 63 61 73 65 20 30 78 34 38 62 30 61 ....case 0x48b0a
80e0: 38 63 37 3a 20 2f 2a 20 44 45 42 55 47 20 2a 2f 8c7: /* DEBUG */
80f0: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d ........flags |=
8100: 20 49 46 46 5f 44 45 42 55 47 3b 0a 09 09 09 09 IFF_DEBUG;.....
8110: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 ...break;.......
8120: 63 61 73 65 20 30 78 34 64 33 64 62 63 64 33 3a case 0x4d3dbcd3:
8130: 20 2f 2a 20 4e 4f 54 52 41 49 4c 45 52 53 20 2a /* NOTRAILERS *
8140: 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c /........flags |
8150: 3d 20 49 46 46 5f 4e 4f 54 52 41 49 4c 45 52 53 = IFF_NOTRAILERS
8160: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a ;........break;.
8170: 09 09 09 09 09 09 63 61 73 65 20 30 78 65 39 37 ......case 0xe97
8180: 37 33 31 34 37 3a 20 2f 2a 20 52 55 4e 4e 49 4e 73147: /* RUNNIN
8190: 47 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 G */........flag
81a0: 73 20 7c 3d 20 49 46 46 5f 52 55 4e 4e 49 4e 47 s |= IFF_RUNNING
81b0: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a ;........break;.
81c0: 09 09 09 09 09 09 63 61 73 65 20 30 78 65 39 66 ......case 0xe9f
81d0: 30 36 62 35 30 3a 20 2f 2a 20 4e 4f 41 52 50 20 06b50: /* NOARP
81e0: 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 */........flags
81f0: 7c 3d 20 49 46 46 5f 4e 4f 41 52 50 3b 0a 09 09 |= IFF_NOARP;...
8200: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
8210: 09 09 63 61 73 65 20 30 78 66 39 31 33 32 33 63 ..case 0xf91323c
8220: 33 3a 20 2f 2a 20 50 52 4f 4d 49 53 43 20 2a 2f 3: /* PROMISC */
8230: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d ........flags |=
8240: 20 49 46 46 5f 50 52 4f 4d 49 53 43 3b 0a 09 09 IFF_PROMISC;...
8250: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
8260: 09 09 63 61 73 65 20 30 78 39 62 32 61 31 38 34 ..case 0x9b2a184
8270: 39 3a 20 2f 2a 20 41 4c 4c 4d 55 4c 54 49 20 2a 9: /* ALLMULTI *
8280: 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c /........flags |
8290: 3d 20 49 46 46 5f 41 4c 4c 4d 55 4c 54 49 3b 0a = IFF_ALLMULTI;.
82a0: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
82b0: 09 09 09 09 63 61 73 65 20 30 78 31 61 37 34 31 ....case 0x1a741
82c0: 34 64 32 3a 20 2f 2a 20 4d 41 53 54 45 52 20 2a 4d2: /* MASTER *
82d0: 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c /........flags |
82e0: 3d 20 49 46 46 5f 4d 41 53 54 45 52 3b 0a 09 09 = IFF_MASTER;...
82f0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
8300: 09 09 63 61 73 65 20 30 78 33 39 39 30 36 39 63 ..case 0x399069c
8310: 35 3a 20 2f 2a 20 53 4c 41 56 45 20 2a 2f 0a 09 5: /* SLAVE */..
8320: 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 ......flags |= I
8330: 46 46 5f 53 4c 41 56 45 3b 0a 09 09 09 09 09 09 FF_SLAVE;.......
8340: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 63 61 .break;.......ca
8350: 73 65 20 30 78 34 64 65 39 32 38 64 34 3a 20 2f se 0x4de928d4: /
8360: 2a 20 4d 55 4c 54 49 43 41 53 54 20 2a 2f 0a 09 * MULTICAST */..
8370: 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 ......flags |= I
8380: 46 46 5f 4d 55 4c 54 49 43 41 53 54 3b 0a 09 09 FF_MULTICAST;...
8390: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
83a0: 09 09 63 61 73 65 20 30 78 32 61 33 35 64 63 34 ..case 0x2a35dc4
83b0: 63 3a 20 2f 2a 20 50 4f 52 54 53 45 4c 20 2a 2f c: /* PORTSEL */
83c0: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d ........flags |=
83d0: 20 49 46 46 5f 50 4f 52 54 53 45 4c 3b 0a 09 09 IFF_PORTSEL;...
83e0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
83f0: 09 09 63 61 73 65 20 30 78 64 31 38 30 61 63 31 ..case 0xd180ac1
8400: 3a 20 2f 2a 20 41 55 54 4f 4d 45 44 49 41 20 2a : /* AUTOMEDIA *
8410: 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c /........flags |
8420: 3d 20 49 46 46 5f 41 55 54 4f 4d 45 44 49 41 3b = IFF_AUTOMEDIA;
8430: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
8440: 09 09 09 09 09 63 61 73 65 20 30 78 65 38 62 61 .....case 0xe8ba
8450: 30 32 63 33 3a 20 2f 2a 20 44 59 4e 41 4d 49 43 02c3: /* DYNAMIC
8460: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 */........flags
8470: 20 7c 3d 20 49 46 46 5f 44 59 4e 41 4d 49 43 3b |= IFF_DYNAMIC;
8480: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
8490: 09 09 09 09 09 63 61 73 65 20 30 78 31 36 63 38 .....case 0x16c8
84a0: 62 34 64 30 3a 20 2f 2a 20 4c 4f 57 45 52 5f 55 b4d0: /* LOWER_U
84b0: 50 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 P */........flag
84c0: 73 20 7c 3d 20 49 46 46 5f 4c 4f 57 45 52 5f 55 s |= IFF_LOWER_U
84d0: 50 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b P;........break;
84e0: 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 32 39 .......case 0x29
84f0: 33 39 35 39 64 34 3a 20 2f 2a 20 44 4f 52 4d 41 3959d4: /* DORMA
8500: 4e 54 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 NT */........fla
8510: 67 73 20 7c 3d 20 49 46 46 5f 44 4f 52 4d 41 4e gs |= IFF_DORMAN
8520: 54 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b T;........break;
8530: 0a 23 69 66 64 65 66 20 49 46 46 5f 45 43 48 4f .#ifdef IFF_ECHO
8540: 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 38 62 .......case 0x8b
8550: 30 65 34 34 66 3a 20 2f 2a 20 45 43 48 4f 20 2a 0e44f: /* ECHO *
8560: 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c /........flags |
8570: 3d 20 49 46 46 5f 45 43 48 4f 3b 0a 09 09 09 09 = IFF_ECHO;.....
8580: 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ...break;.#endif
8590: 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 ......}.....}...
85a0: 09 09 09 69 66 61 63 65 5f 72 65 71 2e 69 66 72 ...iface_req.ifr
85b0: 5f 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a _flags = flags;.
85c0: 0a 09 09 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d .....ioctl_ret =
85d0: 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 53 49 4f ioctl(sock, SIO
85e0: 43 53 49 46 46 4c 41 47 53 2c 20 26 69 66 61 63 CSIFFLAGS, &ifac
85f0: 65 5f 72 65 71 29 3b 0a 09 09 09 09 69 66 20 28 e_req);.....if (
8600: 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30 29 20 ioctl_ret != 0)
8610: 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 {......Tcl_SetOb
8620: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
8630: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8640: 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 (strerror(errno)
8650: 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 09 72 65 , -1));.......re
8660: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
8670: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 62 72 65 61 .....}......brea
8680: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 35 65 39 k;....case 0x5e9
8690: 64 30 33 65 33 3a 20 2f 2a 20 6d 65 74 72 69 63 d03e3: /* metric
86a0: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 31 62 */....case 0x1b
86b0: 37 61 37 35 3a 20 2f 2a 20 6d 74 75 20 2a 2f 0a 7a75: /* mtu */.
86c0: 09 09 09 63 61 73 65 20 30 78 37 63 33 38 39 31 ...case 0x7c3891
86d0: 66 32 3a 20 2f 2a 20 68 77 61 64 64 72 20 2a 2f f2: /* hwaddr */
86e0: 0a 09 09 09 63 61 73 65 20 30 78 62 66 37 32 61 ....case 0xbf72a
86f0: 39 36 39 3a 20 2f 2a 20 61 64 64 6d 75 6c 74 69 969: /* addmulti
8700: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 62 61 */....case 0xba
8710: 37 30 38 39 36 39 3a 20 2f 2a 20 64 65 6c 6d 75 708969: /* delmu
8720: 6c 74 69 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 lti */....case 0
8730: 78 64 64 38 37 36 65 35 3a 20 2f 2a 20 6e 61 6d xdd876e5: /* nam
8740: 65 20 2a 2f 0a 09 09 09 09 09 54 63 6c 5f 53 65 e */......Tcl_Se
8750: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
8760: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
8770: 28 22 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 ("option \"%s\"
8780: 75 6e 73 75 70 70 6f 72 74 65 64 22 2c 20 54 63 unsupported", Tc
8790: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 70 74 69 l_GetString(opti
87a0: 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29 3b 0a on_name_obj)));.
87b0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c ......return(TCL
87c0: 5f 45 52 52 4f 52 29 3b 0a 09 09 09 09 62 72 65 _ERROR);.....bre
87d0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 34 65 ak;....case 0x4e
87e0: 39 61 65 61 66 33 3a 20 2f 2a 20 61 64 64 72 65 9aeaf3: /* addre
87f0: 73 73 20 2a 2f 0a 09 09 09 09 69 66 20 28 74 6d ss */.....if (tm
8800: 70 5f 69 6f 63 74 6c 20 3d 3d 20 2d 31 29 20 7b p_ioctl == -1) {
8810: 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c 20 ......tmp_ioctl
8820: 3d 20 53 49 4f 43 53 49 46 41 44 44 52 3b 0a 09 = SIOCSIFADDR;..
8830: 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c 5f 61 64 ....tmp_ioctl_ad
8840: 64 72 20 3d 20 26 69 66 61 63 65 5f 72 65 71 2e dr = &iface_req.
8850: 69 66 72 5f 61 64 64 72 3b 0a 09 09 09 09 7d 0a ifr_addr;.....}.
8860: 0a 09 09 09 63 61 73 65 20 30 78 65 63 30 35 37 ....case 0xec057
8870: 30 36 65 3a 20 2f 2a 20 64 65 73 74 69 6e 61 74 06e: /* destinat
8880: 69 6f 6e 20 2a 2f 0a 09 09 09 09 69 66 20 28 74 ion */.....if (t
8890: 6d 70 5f 69 6f 63 74 6c 20 3d 3d 20 2d 31 29 20 mp_ioctl == -1)
88a0: 7b 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c {......tmp_ioctl
88b0: 20 3d 20 53 49 4f 43 53 49 46 44 53 54 41 44 44 = SIOCSIFDSTADD
88c0: 52 3b 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63 74 R;......tmp_ioct
88d0: 6c 5f 61 64 64 72 20 3d 20 26 69 66 61 63 65 5f l_addr = &iface_
88e0: 72 65 71 2e 69 66 72 5f 64 73 74 61 64 64 72 3b req.ifr_dstaddr;
88f0: 0a 09 09 09 09 7d 0a 0a 09 09 09 63 61 73 65 20 .....}.....case
8900: 30 78 33 65 61 37 65 36 37 34 3a 20 2f 2a 20 62 0x3ea7e674: /* b
8910: 72 6f 61 64 63 61 73 74 20 2a 2f 0a 09 09 09 09 roadcast */.....
8920: 69 66 20 28 74 6d 70 5f 69 6f 63 74 6c 20 3d 3d if (tmp_ioctl ==
8930: 20 2d 31 29 20 7b 0a 09 09 09 09 09 74 6d 70 5f -1) {......tmp_
8940: 69 6f 63 74 6c 20 3d 20 53 49 4f 43 53 49 46 42 ioctl = SIOCSIFB
8950: 52 44 41 44 44 52 3b 0a 09 09 09 09 09 74 6d 70 RDADDR;......tmp
8960: 5f 69 6f 63 74 6c 5f 61 64 64 72 20 3d 20 26 69 _ioctl_addr = &i
8970: 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 62 72 6f face_req.ifr_bro
8980: 61 64 61 64 64 72 3b 0a 09 09 09 09 7d 0a 0a 09 adaddr;.....}...
8990: 09 09 63 61 73 65 20 30 78 34 64 36 35 65 65 36 ..case 0x4d65ee6
89a0: 62 3a 20 2f 2a 20 6e 65 74 6d 61 73 6b 20 2a 2f b: /* netmask */
89b0: 0a 09 09 09 09 69 66 20 28 74 6d 70 5f 69 6f 63 .....if (tmp_ioc
89c0: 74 6c 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 09 tl == -1) {.....
89d0: 09 74 6d 70 5f 69 6f 63 74 6c 20 3d 20 53 49 4f .tmp_ioctl = SIO
89e0: 43 53 49 46 4e 45 54 4d 41 53 4b 3b 0a 09 09 09 CSIFNETMASK;....
89f0: 09 09 74 6d 70 5f 69 6f 63 74 6c 5f 61 64 64 72 ..tmp_ioctl_addr
8a00: 20 3d 20 26 69 66 61 63 65 5f 72 65 71 2e 69 66 = &iface_req.if
8a10: 72 5f 6e 65 74 6d 61 73 6b 3b 0a 09 09 09 09 7d r_netmask;.....}
8a20: 0a 0a 09 09 09 09 70 61 72 73 65 5f 72 65 74 20 ......parse_ret
8a30: 3d 20 74 63 6c 73 79 73 74 65 6d 5f 70 72 69 76 = tclsystem_priv
8a40: 61 74 65 5f 67 65 74 5f 73 6f 63 6b 61 64 64 72 ate_get_sockaddr
8a50: 5f 66 72 6f 6d 5f 6f 62 6a 28 6f 70 74 69 6f 6e _from_obj(option
8a60: 5f 76 61 6c 5f 6f 62 6a 2c 20 74 6d 70 5f 69 6f _val_obj, tmp_io
8a70: 63 74 6c 5f 61 64 64 72 29 3b 0a 09 09 09 09 69 ctl_addr);.....i
8a80: 66 20 28 70 61 72 73 65 5f 72 65 74 20 21 3d 20 f (parse_ret !=
8a90: 30 29 20 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 0) {......Tcl_Se
8aa0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
8ab0: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
8ac0: 28 22 75 6e 61 62 6c 65 20 74 6f 20 70 61 72 73 ("unable to pars
8ad0: 65 20 5c 22 25 73 5c 22 20 61 73 20 61 6e 20 61 e \"%s\" as an a
8ae0: 64 64 72 65 73 73 22 2c 20 54 63 6c 5f 47 65 74 ddress", Tcl_Get
8af0: 53 74 72 69 6e 67 28 6f 70 74 69 6f 6e 5f 76 61 String(option_va
8b00: 6c 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 09 09 l_obj)));.......
8b10: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8b20: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 77 );.....}......sw
8b30: 69 74 63 68 20 28 74 6d 70 5f 69 6f 63 74 6c 5f itch (tmp_ioctl_
8b40: 61 64 64 72 2d 3e 73 61 5f 66 61 6d 69 6c 79 29 addr->sa_family)
8b50: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 41 46 5f {......case AF_
8b60: 49 4e 45 54 3a 0a 09 09 09 09 09 09 74 6d 70 5f INET:.......tmp_
8b70: 73 6f 63 6b 20 3d 20 73 6f 63 6b 5f 76 34 3b 0a sock = sock_v4;.
8b80: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
8b90: 09 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36 ...case AF_INET6
8ba0: 3a 0a 09 09 09 09 09 09 74 6d 70 5f 73 6f 63 6b :.......tmp_sock
8bb0: 20 3d 20 73 6f 63 6b 5f 76 36 3b 0a 0a 09 09 09 = sock_v6;.....
8bc0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 ...break;......d
8bd0: 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 54 63 efault:.......Tc
8be0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
8bf0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
8c00: 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65 20 ringObj("unable
8c10: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 61 64 64 to determine add
8c20: 72 65 73 73 20 66 61 6d 69 6c 79 20 6f 66 20 73 ress family of s
8c30: 6f 63 6b 61 64 64 72 22 2c 20 2d 31 29 29 3b 0a ockaddr", -1));.
8c40: 09 09 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c ......return(TCL
8c50: 5f 45 52 52 4f 52 29 3b 0a 09 09 09 09 7d 0a 0a _ERROR);.....}..
8c60: 09 09 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 ....ioctl_ret =
8c70: 69 6f 63 74 6c 28 74 6d 70 5f 73 6f 63 6b 2c 20 ioctl(tmp_sock,
8c80: 74 6d 70 5f 69 6f 63 74 6c 2c 20 26 69 66 61 63 tmp_ioctl, &ifac
8c90: 65 5f 72 65 71 29 3b 0a 09 09 09 09 69 66 20 28 e_req);.....if (
8ca0: 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30 29 20 ioctl_ret != 0)
8cb0: 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 {......Tcl_SetOb
8cc0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
8cd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8ce0: 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 (strerror(errno)
8cf0: 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 09 72 65 , -1));.......re
8d00: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
8d10: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 62 72 65 61 .....}......brea
8d20: 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 k;....default:..
8d30: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
8d40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
8d50: 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e 6b 6e 6f ObjPrintf("unkno
8d60: 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 wn option \"%s\"
8d70: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ", Tcl_GetString
8d80: 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a (option_name_obj
8d90: 29 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e )));......return
8da0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d (TCL_ERROR);...}
8db0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c ..}...return(TCL
8dc0: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 _OK);.}..static
8dd0: 69 6e 74 20 74 63 6c 73 79 73 74 65 6d 5f 69 66 int tclsystem_if
8de0: 63 6f 6e 66 69 67 28 43 6c 69 65 6e 74 44 61 74 config(ClientDat
8df0: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 a cd, Tcl_Interp
8e00: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
8e10: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e jc, Tcl_Obj *CON
8e20: 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 69 6e ST objv[]) {..in
8e30: 74 20 73 6f 63 6b 5f 76 34 2c 20 73 6f 63 6b 5f t sock_v4, sock_
8e40: 76 36 2c 20 73 6f 63 6b 3b 0a 09 69 6e 74 20 72 v6, sock;..int r
8e50: 65 74 76 61 6c 20 3d 20 54 43 4c 5f 45 52 52 4f etval = TCL_ERRO
8e60: 52 3b 0a 0a 09 73 6f 63 6b 20 3d 20 74 63 6c 73 R;...sock = tcls
8e70: 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 67 ystem_internal_g
8e80: 65 74 73 6f 63 6b 28 26 73 6f 63 6b 5f 76 34 2c etsock(&sock_v4,
8e90: 20 26 73 6f 63 6b 5f 76 36 29 3b 0a 09 69 66 20 &sock_v6);..if
8ea0: 28 73 6f 63 6b 20 3d 3d 20 2d 31 29 20 7b 0a 09 (sock == -1) {..
8eb0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
8ec0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
8ed0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 wStringObj("unab
8ee0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 73 6f 63 le to create soc
8ef0: 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 ket", -1));....r
8f00: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
8f10: 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 6f ;..}...switch (o
8f20: 62 6a 63 29 20 7b 0a 09 09 63 61 73 65 20 30 3a bjc) {...case 0:
8f30: 0a 09 09 63 61 73 65 20 31 3a 20 2f 2a 20 4e 6f ...case 1: /* No
8f40: 20 61 72 67 75 6d 65 6e 74 73 2c 20 6c 69 73 74 arguments, list
8f50: 20 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 73 20 all interfaces
8f60: 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 74 */....retval = t
8f70: 63 6c 73 79 73 74 65 6d 5f 69 66 63 6f 6e 66 69 clsystem_ifconfi
8f80: 67 5f 6c 69 73 74 28 63 64 2c 20 69 6e 74 65 72 g_list(cd, inter
8f90: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 p, objc, objv, s
8fa0: 6f 63 6b 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b ock);.....break;
8fb0: 0a 09 09 63 61 73 65 20 32 3a 20 2f 2a 20 4f 6e ...case 2: /* On
8fc0: 65 20 61 72 67 75 6d 65 6e 74 2c 20 67 69 76 65 e argument, give
8fd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f information abo
8fe0: 75 74 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 ut the interface
8ff0: 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 */....retval =
9000: 74 63 6c 73 79 73 74 65 6d 5f 69 66 63 6f 6e 66 tclsystem_ifconf
9010: 69 67 5f 69 6e 66 6f 28 63 64 2c 20 69 6e 74 65 ig_info(cd, inte
9020: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 rp, objc, objv,
9030: 73 6f 63 6b 2c 20 73 6f 63 6b 5f 76 34 2c 20 73 sock, sock_v4, s
9040: 6f 63 6b 5f 76 36 29 3b 0a 0a 09 09 09 62 72 65 ock_v6);.....bre
9050: 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 ak;...default:..
9060: 09 09 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 ../* Otherwise,
9070: 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e configure the in
9080: 74 65 72 61 63 65 20 2a 2f 0a 09 09 09 72 65 74 terace */....ret
9090: 76 61 6c 20 3d 20 74 63 6c 73 79 73 74 65 6d 5f val = tclsystem_
90a0: 69 66 63 6f 6e 66 69 67 5f 63 6f 6e 66 28 63 64 ifconfig_conf(cd
90b0: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 , interp, objc,
90c0: 6f 62 6a 76 2c 20 73 6f 63 6b 2c 20 73 6f 63 6b objv, sock, sock
90d0: 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 29 3b 0a 0a _v4, sock_v6);..
90e0: 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f ...break;..}.../
90f0: 2a 20 43 6c 65 61 6e 75 70 20 2a 2f 0a 09 69 66 * Cleanup */..if
9100: 20 28 73 6f 63 6b 5f 76 34 20 21 3d 20 2d 31 29 (sock_v4 != -1)
9110: 20 7b 0a 09 09 63 6c 6f 73 65 28 73 6f 63 6b 5f {...close(sock_
9120: 76 34 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f v4);..}...if (so
9130: 63 6b 5f 76 36 20 21 3d 20 2d 31 29 20 7b 0a 09 ck_v6 != -1) {..
9140: 09 63 6c 6f 73 65 28 73 6f 63 6b 5f 76 36 29 3b .close(sock_v6);
9150: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 ..}...return(ret
9160: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 val);.}..static
9170: 69 6e 74 20 74 63 6c 73 79 73 74 65 6d 5f 72 6f int tclsystem_ro
9180: 75 74 65 5f 6c 69 73 74 28 43 6c 69 65 6e 74 44 ute_list(ClientD
9190: 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 ata cd, Tcl_Inte
91a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
91b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 objc, Tcl_Obj *C
91c0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 ONST objv[], int
91d0: 20 73 6f 63 6b 5f 76 34 2c 20 69 6e 74 20 73 6f sock_v4, int so
91e0: 63 6b 5f 76 36 29 20 7b 0a 09 54 63 6c 5f 53 65 ck_v6) {..Tcl_Se
91f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
9200: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
9210: 4f 62 6a 28 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 Obj("not impleme
9220: 6e 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 nted", -1));...r
9230: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
9240: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 ;.}..static int
9250: 74 63 6c 73 79 73 74 65 6d 5f 72 6f 75 74 65 5f tclsystem_route_
9260: 63 6f 6e 66 28 43 6c 69 65 6e 74 44 61 74 61 20 conf(ClientData
9270: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a cd, Tcl_Interp *
9280: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
9290: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 , Tcl_Obj *CONST
92a0: 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73 6f 63 objv[], int soc
92b0: 6b 5f 76 34 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 k_v4, int sock_v
92c0: 36 29 20 7b 0a 09 54 63 6c 5f 57 69 64 65 49 6e 6) {..Tcl_WideIn
92d0: 74 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f 77 69 64 t option_val_wid
92e0: 65 3b 20 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 70 e; ..Tcl_Obj *op
92f0: 65 72 61 74 69 6f 6e 5f 6f 62 6a 2c 20 2a 64 65 eration_obj, *de
9300: 73 74 5f 6f 62 6a 2c 20 2a 64 65 73 74 6d 61 73 st_obj, *destmas
9310: 6b 5f 6f 62 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 k_obj;..Tcl_Obj
9320: 2a 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a *option_name_obj
9330: 2c 20 2a 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 , *option_val_ob
9340: 6a 3b 0a 09 73 74 72 75 63 74 20 72 74 65 6e 74 j;..struct rtent
9350: 72 79 20 72 6f 75 74 65 3b 0a 09 69 6e 74 20 73 ry route;..int s
9360: 6f 63 6b 3b 0a 09 69 6e 74 20 69 6f 63 74 6c 5f ock;..int ioctl_
9370: 69 64 3b 0a 09 69 6e 74 20 74 63 6c 5f 72 65 74 id;..int tcl_ret
9380: 2c 20 69 6f 63 74 6c 5f 72 65 74 2c 20 70 61 72 , ioctl_ret, par
9390: 73 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 se_ret;...if (ob
93a0: 6a 63 20 3c 20 34 29 20 7b 0a 09 09 54 63 6c 5f jc < 4) {...Tcl_
93b0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
93c0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
93d0: 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 ngObj("wrong # a
93e0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c rgs: should be \
93f0: 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 "::system::sysca
9400: 6c 6c 3a 3a 72 6f 75 74 65 20 6f 70 65 72 61 74 ll::route operat
9410: 69 6f 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 ion destination
9420: 64 65 73 74 69 6e 61 74 69 6f 6e 5f 6d 61 73 6b destination_mask
9430: 20 3f 6f 70 74 69 6f 6e 73 3f 5c 22 22 2c 20 2d ?options?\"", -
9440: 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 1));....return(T
9450: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 CL_ERROR);..}...
9460: 2f 2a 20 43 6c 65 61 72 20 6f 62 6a 65 63 74 20 /* Clear object
9470: 76 61 6c 75 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 values */..memse
9480: 74 28 26 72 6f 75 74 65 2c 20 30 2c 20 73 69 7a t(&route, 0, siz
9490: 65 6f 66 28 72 6f 75 74 65 29 29 3b 0a 0a 09 2f eof(route));.../
94a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 6f 70 65 72 * Determine oper
94b0: 61 74 69 6f 6e 20 2a 2f 0a 09 6f 70 65 72 61 74 ation */..operat
94c0: 69 6f 6e 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31 ion_obj = objv[1
94d0: 5d 3b 0a 09 73 77 69 74 63 68 20 28 74 63 6c 73 ];..switch (tcls
94e0: 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 ystem_internal_s
94f0: 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 6f 70 implehash_obj(op
9500: 65 72 61 74 69 6f 6e 5f 6f 62 6a 29 29 20 7b 0a eration_obj)) {.
9510: 09 09 63 61 73 65 20 30 78 31 38 37 32 36 34 3a ..case 0x187264:
9520: 20 2f 2a 20 61 64 64 20 2a 2f 0a 09 09 09 69 6f /* add */....io
9530: 63 74 6c 5f 69 64 20 3d 20 53 49 4f 43 41 44 44 ctl_id = SIOCADD
9540: 52 54 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 RT;....break;...
9550: 63 61 73 65 20 30 78 31 39 33 32 65 63 3a 20 2f case 0x1932ec: /
9560: 2a 20 64 65 6c 20 2a 2f 0a 09 09 63 61 73 65 20 * del */...case
9570: 30 78 35 64 39 38 65 39 36 35 3a 20 2f 2a 20 64 0x5d98e965: /* d
9580: 65 6c 65 74 65 20 2a 2f 0a 09 09 09 69 6f 63 74 elete */....ioct
9590: 6c 5f 69 64 20 3d 20 53 49 4f 43 44 45 4c 52 54 l_id = SIOCDELRT
95a0: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 ;....break;...de
95b0: 66 61 75 6c 74 3a 0a 09 09 09 54 63 6c 5f 53 65 fault:....Tcl_Se
95c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
95d0: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
95e0: 28 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 25 ("bad option \"%
95f0: 73 5c 22 3a 20 6d 75 73 74 20 62 65 20 61 64 64 s\": must be add
9600: 2c 20 6f 72 20 64 65 6c 65 74 65 22 2c 20 54 63 , or delete", Tc
9610: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 70 65 72 l_GetString(oper
9620: 61 74 69 6f 6e 5f 6f 62 6a 29 29 29 3b 0a 0a 09 ation_obj)));...
9630: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
9640: 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 OR);..}.../* Set
9650: 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 2a default flags *
9660: 2f 0a 09 72 6f 75 74 65 2e 72 74 5f 66 6c 61 67 /..route.rt_flag
9670: 73 20 3d 20 52 54 46 5f 55 50 3b 0a 0a 09 2f 2a s = RTF_UP;.../*
9680: 20 50 61 72 73 65 20 64 65 73 74 69 6e 61 74 69 Parse destinati
9690: 6f 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 09 64 on address */..d
96a0: 65 73 74 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 32 est_obj = objv[2
96b0: 5d 3b 0a 09 70 61 72 73 65 5f 72 65 74 20 3d 20 ];..parse_ret =
96c0: 74 63 6c 73 79 73 74 65 6d 5f 70 72 69 76 61 74 tclsystem_privat
96d0: 65 5f 67 65 74 5f 73 6f 63 6b 61 64 64 72 5f 66 e_get_sockaddr_f
96e0: 72 6f 6d 5f 6f 62 6a 28 64 65 73 74 5f 6f 62 6a rom_obj(dest_obj
96f0: 2c 20 26 72 6f 75 74 65 2e 72 74 5f 64 73 74 29 , &route.rt_dst)
9700: 3b 0a 09 69 66 20 28 70 61 72 73 65 5f 72 65 74 ;..if (parse_ret
9710: 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 != 0) {...Tcl_S
9720: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
9730: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
9740: 66 28 22 75 6e 61 62 6c 65 20 74 6f 20 70 61 72 f("unable to par
9750: 73 65 20 5c 22 25 73 5c 22 20 61 73 20 61 6e 20 se \"%s\" as an
9760: 61 64 64 72 65 73 73 22 2c 20 54 63 6c 5f 47 65 address", Tcl_Ge
9770: 74 53 74 72 69 6e 67 28 64 65 73 74 5f 6f 62 6a tString(dest_obj
9780: 29 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 )));....return(T
9790: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 CL_ERROR);..}...
97a0: 2f 2a 20 50 61 72 73 65 20 64 65 73 74 69 6e 61 /* Parse destina
97b0: 74 69 6f 6e 20 6e 65 74 6d 61 73 6b 20 2a 2f 0a tion netmask */.
97c0: 09 64 65 73 74 6d 61 73 6b 5f 6f 62 6a 20 3d 20 .destmask_obj =
97d0: 6f 62 6a 76 5b 33 5d 3b 0a 09 70 61 72 73 65 5f objv[3];..parse_
97e0: 72 65 74 20 3d 20 74 63 6c 73 79 73 74 65 6d 5f ret = tclsystem_
97f0: 70 72 69 76 61 74 65 5f 67 65 74 5f 73 6f 63 6b private_get_sock
9800: 61 64 64 72 5f 66 72 6f 6d 5f 6f 62 6a 28 64 65 addr_from_obj(de
9810: 73 74 6d 61 73 6b 5f 6f 62 6a 2c 20 26 72 6f 75 stmask_obj, &rou
9820: 74 65 2e 72 74 5f 67 65 6e 6d 61 73 6b 29 3b 0a te.rt_genmask);.
9830: 09 69 66 20 28 70 61 72 73 65 5f 72 65 74 20 21 .if (parse_ret !
9840: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 = 0) {...Tcl_Set
9850: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
9860: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
9870: 22 75 6e 61 62 6c 65 20 74 6f 20 70 61 72 73 65 "unable to parse
9880: 20 5c 22 25 73 5c 22 20 61 73 20 61 6e 20 61 64 \"%s\" as an ad
9890: 64 72 65 73 73 22 2c 20 54 63 6c 5f 47 65 74 53 dress", Tcl_GetS
98a0: 74 72 69 6e 67 28 64 65 73 74 6d 61 73 6b 5f 6f tring(destmask_o
98b0: 62 6a 29 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e bj)));....return
98c0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a (TCL_ERROR);..}.
98d0: 0a 09 69 66 20 28 72 6f 75 74 65 2e 72 74 5f 64 ..if (route.rt_d
98e0: 73 74 2e 73 61 5f 66 61 6d 69 6c 79 20 21 3d 20 st.sa_family !=
98f0: 72 6f 75 74 65 2e 72 74 5f 67 65 6e 6d 61 73 6b route.rt_genmask
9900: 2e 73 61 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 .sa_family) {...
9910: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
9920: 28 69 6e 74 65 72 70 2c 0a 09 09 20 20 54 63 6c (interp,... Tcl
9930: 5f 4f 62 6a 50 72 69 6e 74 66 28 22 64 65 73 74 _ObjPrintf("dest
9940: 69 6e 61 74 69 6f 6e 20 28 5c 22 25 73 5c 22 29 ination (\"%s\")
9950: 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e and destination
9960: 5f 6d 61 73 6b 20 28 5c 22 25 73 5c 22 29 20 61 _mask (\"%s\") a
9970: 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6c 61 re different cla
9980: 73 73 65 73 22 2c 0a 09 09 20 20 20 20 54 63 6c sses",... Tcl
9990: 5f 47 65 74 53 74 72 69 6e 67 28 64 65 73 74 5f _GetString(dest_
99a0: 6f 62 6a 29 2c 0a 09 09 20 20 20 20 54 63 6c 5f obj),... Tcl_
99b0: 47 65 74 53 74 72 69 6e 67 28 64 65 73 74 6d 61 GetString(destma
99c0: 73 6b 5f 6f 62 6a 29 0a 09 09 20 20 29 0a 09 09 sk_obj)... )...
99d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c );....return(TCL
99e0: 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 _ERROR);..}...sw
99f0: 69 74 63 68 20 28 72 6f 75 74 65 2e 72 74 5f 64 itch (route.rt_d
9a00: 73 74 2e 73 61 5f 66 61 6d 69 6c 79 29 20 7b 0a st.sa_family) {.
9a10: 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 3a 20 ..case AF_INET:
9a20: 2f 2a 20 49 50 76 34 20 2a 2f 0a 09 09 09 69 66 /* IPv4 */....if
9a30: 20 28 73 6f 63 6b 5f 76 34 20 3d 3d 20 2d 31 29 (sock_v4 == -1)
9a40: 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 {.....Tcl_SetOb
9a50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
9a60: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 61 Tcl_ObjPrintf("a
9a70: 64 64 72 65 73 73 20 5c 22 25 73 5c 22 20 69 73 ddress \"%s\" is
9a80: 20 49 50 76 34 2c 20 62 75 74 20 75 6e 61 62 6c IPv4, but unabl
9a90: 65 20 74 6f 20 63 72 65 61 74 65 20 49 50 76 34 e to create IPv4
9aa0: 20 73 6f 63 6b 65 74 22 2c 20 54 63 6c 5f 47 65 socket", Tcl_Ge
9ab0: 74 53 74 72 69 6e 67 28 64 65 73 74 5f 6f 62 6a tString(dest_obj
9ac0: 29 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e )));......return
9ad0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 (TCL_ERROR);....
9ae0: 7d 0a 0a 09 09 09 69 66 20 28 28 28 73 74 72 75 }.....if (((stru
9af0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a ct sockaddr_in *
9b00: 29 20 26 72 6f 75 74 65 2e 72 74 5f 67 65 6e 6d ) &route.rt_genm
9b10: 61 73 6b 29 2d 3e 73 69 6e 5f 61 64 64 72 2e 73 ask)->sin_addr.s
9b20: 5f 61 64 64 72 20 3d 3d 20 49 4e 41 44 44 52 5f _addr == INADDR_
9b30: 42 52 4f 41 44 43 41 53 54 29 20 7b 0a 09 09 09 BROADCAST) {....
9b40: 09 72 6f 75 74 65 2e 72 74 5f 66 6c 61 67 73 20 .route.rt_flags
9b50: 7c 3d 20 52 54 46 5f 48 4f 53 54 3b 0a 09 09 09 |= RTF_HOST;....
9b60: 7d 0a 0a 09 09 09 73 6f 63 6b 20 3d 20 73 6f 63 }.....sock = soc
9b70: 6b 5f 76 34 3b 0a 0a 09 09 09 62 72 65 61 6b 3b k_v4;.....break;
9b80: 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36 ...case AF_INET6
9b90: 3a 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 09 09 09 : /* IPv6 */....
9ba0: 69 66 20 28 73 6f 63 6b 5f 76 36 20 3d 3d 20 2d if (sock_v6 == -
9bb0: 31 29 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74 1) {.....Tcl_Set
9bc0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
9bd0: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
9be0: 22 61 64 64 72 65 73 73 20 5c 22 25 73 5c 22 20 "address \"%s\"
9bf0: 69 73 20 49 50 76 36 2c 20 62 75 74 20 75 6e 61 is IPv6, but una
9c00: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 49 50 ble to create IP
9c10: 76 36 20 73 6f 63 6b 65 74 22 2c 20 54 63 6c 5f v6 socket", Tcl_
9c20: 47 65 74 53 74 72 69 6e 67 28 64 65 73 74 5f 6f GetString(dest_o
9c30: 62 6a 29 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 bj)));......retu
9c40: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
9c50: 09 09 7d 0a 0a 09 09 09 73 6f 63 6b 20 3d 20 73 ..}.....sock = s
9c60: 6f 63 6b 5f 76 36 3b 0a 0a 09 09 09 62 72 65 61 ock_v6;.....brea
9c70: 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 k;...default:...
9c80: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
9c90: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
9ca0: 6a 50 72 69 6e 74 66 28 22 75 6e 61 62 6c 65 20 jPrintf("unable
9cb0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 to determine typ
9cc0: 65 20 6f 66 20 61 64 64 72 65 73 73 20 66 6f 72 e of address for
9cd0: 20 5c 22 25 73 5c 22 22 2c 20 54 63 6c 5f 47 65 \"%s\"", Tcl_Ge
9ce0: 74 53 74 72 69 6e 67 28 64 65 73 74 5f 6f 62 6a tString(dest_obj
9cf0: 29 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 )));.....return(
9d00: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a TCL_ERROR);..}..
9d10: 09 2f 2a 20 50 61 72 73 65 20 72 65 6d 61 69 6e ./* Parse remain
9d20: 69 6e 67 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 09 ing options */..
9d30: 6f 62 6a 63 20 2d 3d 20 34 3b 0a 09 6f 62 6a 76 objc -= 4;..objv
9d40: 20 2b 3d 20 34 3b 0a 0a 09 66 6f 72 20 28 3b 20 += 4;...for (;
9d50: 6f 62 6a 63 20 3e 20 30 3b 20 6f 62 6a 63 2d 2d objc > 0; objc--
9d60: 2c 6f 62 6a 76 2b 2b 29 20 7b 0a 09 09 6f 70 74 ,objv++) {...opt
9d70: 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 20 3d 20 6f ion_name_obj = o
9d80: 62 6a 76 5b 30 5d 3b 0a 0a 09 09 69 66 20 28 6f bjv[0];....if (o
9d90: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 09 09 54 63 bjc < 2) {....Tc
9da0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
9db0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
9dc0: 69 6e 74 66 28 22 6f 70 74 69 6f 6e 20 5c 22 25 intf("option \"%
9dd0: 73 5c 22 20 72 65 71 75 69 72 65 73 20 61 6e 20 s\" requires an
9de0: 61 72 67 75 6d 65 6e 74 22 2c 20 54 63 6c 5f 47 argument", Tcl_G
9df0: 65 74 53 74 72 69 6e 67 28 6f 70 74 69 6f 6e 5f etString(option_
9e00: 6e 61 6d 65 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 name_obj)));....
9e10: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
9e20: 52 29 3b 0a 09 09 7d 0a 0a 09 09 6f 62 6a 63 2d R);...}....objc-
9e30: 2d 3b 0a 09 09 6f 62 6a 76 2b 2b 3b 0a 0a 09 09 -;...objv++;....
9e40: 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a 20 3d option_val_obj =
9e50: 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 09 09 73 77 69 objv[0];....swi
9e60: 74 63 68 20 28 74 63 6c 73 79 73 74 65 6d 5f 69 tch (tclsystem_i
9e70: 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68 61 nternal_simpleha
9e80: 73 68 5f 6f 62 6a 28 6f 70 74 69 6f 6e 5f 6e 61 sh_obj(option_na
9e90: 6d 65 5f 6f 62 6a 29 29 20 7b 0a 09 09 09 63 61 me_obj)) {....ca
9ea0: 73 65 20 30 78 34 63 37 32 37 37 37 39 3a 20 2f se 0x4c727779: /
9eb0: 2a 20 67 61 74 65 77 61 79 20 2a 2f 0a 09 09 09 * gateway */....
9ec0: 09 70 61 72 73 65 5f 72 65 74 20 3d 20 74 63 6c .parse_ret = tcl
9ed0: 73 79 73 74 65 6d 5f 70 72 69 76 61 74 65 5f 67 system_private_g
9ee0: 65 74 5f 73 6f 63 6b 61 64 64 72 5f 66 72 6f 6d et_sockaddr_from
9ef0: 5f 6f 62 6a 28 6f 70 74 69 6f 6e 5f 76 61 6c 5f _obj(option_val_
9f00: 6f 62 6a 2c 20 26 72 6f 75 74 65 2e 72 74 5f 67 obj, &route.rt_g
9f10: 61 74 65 77 61 79 29 3b 0a 09 09 09 09 69 66 20 ateway);.....if
9f20: 28 70 61 72 73 65 5f 72 65 74 20 21 3d 20 30 29 (parse_ret != 0)
9f30: 20 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f {......Tcl_SetO
9f40: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
9f50: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 Tcl_ObjPrintf("
9f60: 75 6e 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 unable to parse
9f70: 5c 22 25 73 5c 22 20 61 73 20 61 6e 20 61 64 64 \"%s\" as an add
9f80: 72 65 73 73 22 2c 20 54 63 6c 5f 47 65 74 53 74 ress", Tcl_GetSt
9f90: 72 69 6e 67 28 6f 70 74 69 6f 6e 5f 76 61 6c 5f ring(option_val_
9fa0: 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 09 09 72 65 obj)));.......re
9fb0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
9fc0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 72 6f 75 74 .....}......rout
9fd0: 65 2e 72 74 5f 66 6c 61 67 73 20 26 3d 20 28 7e e.rt_flags &= (~
9fe0: 52 54 46 5f 48 4f 53 54 29 3b 0a 09 09 09 09 72 RTF_HOST);.....r
9ff0: 6f 75 74 65 2e 72 74 5f 66 6c 61 67 73 20 7c 3d oute.rt_flags |=
a000: 20 52 54 46 5f 47 41 54 45 57 41 59 3b 0a 0a 09 RTF_GATEWAY;...
a010: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
a020: 65 20 30 78 31 62 37 61 37 35 3a 20 2f 2a 20 6d e 0x1b7a75: /* m
a030: 74 75 20 2a 2f 0a 09 09 09 09 74 63 6c 5f 72 65 tu */.....tcl_re
a040: 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 t = Tcl_GetWideI
a050: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
a060: 2c 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a , option_val_obj
a070: 2c 20 26 6f 70 74 69 6f 6e 5f 76 61 6c 5f 77 69 , &option_val_wi
a080: 64 65 29 3b 0a 09 09 09 09 69 66 20 28 74 63 6c de);.....if (tcl
a090: 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 _ret != TCL_OK)
a0a0: 7b 0a 09 09 09 09 09 72 65 74 75 72 6e 28 74 63 {......return(tc
a0b0: 6c 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 l_ret);.....}...
a0c0: 09 09 09 72 6f 75 74 65 2e 72 74 5f 66 6c 61 67 ...route.rt_flag
a0d0: 73 20 7c 3d 20 52 54 46 5f 4d 54 55 3b 0a 09 09 s |= RTF_MTU;...
a0e0: 09 09 72 6f 75 74 65 2e 72 74 5f 6d 74 75 20 3d ..route.rt_mtu =
a0f0: 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f 77 69 64 65 option_val_wide
a100: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
a110: 09 63 61 73 65 20 30 78 35 65 39 64 30 33 65 33 .case 0x5e9d03e3
a120: 3a 20 2f 2a 20 6d 65 74 72 69 63 20 2a 2f 0a 09 : /* metric */..
a130: 09 09 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c ...tcl_ret = Tcl
a140: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f _GetWideIntFromO
a150: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f bj(interp, optio
a160: 6e 5f 76 61 6c 5f 6f 62 6a 2c 20 26 6f 70 74 69 n_val_obj, &opti
a170: 6f 6e 5f 76 61 6c 5f 77 69 64 65 29 3b 0a 09 09 on_val_wide);...
a180: 09 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d ..if (tcl_ret !=
a190: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 TCL_OK) {......
a1a0: 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b return(tcl_ret);
a1b0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 72 6f 75 74 .....}......rout
a1c0: 65 2e 72 74 5f 6d 65 74 72 69 63 20 3d 20 6f 70 e.rt_metric = op
a1d0: 74 69 6f 6e 5f 76 61 6c 5f 77 69 64 65 3b 0a 0a tion_val_wide;..
a1e0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
a1f0: 73 65 20 30 78 39 64 64 38 65 38 66 37 3a 20 2f se 0x9dd8e8f7: /
a200: 2a 20 77 69 6e 64 6f 77 20 2a 2f 0a 09 09 09 09 * window */.....
a210: 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65 tcl_ret = Tcl_Ge
a220: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 tWideIntFromObj(
a230: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 5f 76 interp, option_v
a240: 61 6c 5f 6f 62 6a 2c 20 26 6f 70 74 69 6f 6e 5f al_obj, &option_
a250: 76 61 6c 5f 77 69 64 65 29 3b 0a 09 09 09 09 69 val_wide);.....i
a260: 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 f (tcl_ret != TC
a270: 4c 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 72 65 74 L_OK) {......ret
a280: 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09 09 urn(tcl_ret);...
a290: 09 09 7d 0a 0a 09 09 09 09 72 6f 75 74 65 2e 72 ..}......route.r
a2a0: 74 5f 66 6c 61 67 73 20 7c 3d 20 52 54 46 5f 57 t_flags |= RTF_W
a2b0: 49 4e 44 4f 57 3b 0a 09 09 09 09 72 6f 75 74 65 INDOW;.....route
a2c0: 2e 72 74 5f 77 69 6e 64 6f 77 20 3d 20 6f 70 74 .rt_window = opt
a2d0: 69 6f 6e 5f 76 61 6c 5f 77 69 64 65 3b 0a 0a 09 ion_val_wide;...
a2e0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
a2f0: 65 20 30 78 31 39 33 32 66 36 3a 20 2f 2a 20 64 e 0x1932f6: /* d
a300: 65 76 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 ev */....case 0x
a310: 35 65 64 62 65 32 65 35 3a 20 2f 2a 20 64 65 76 5edbe2e5: /* dev
a320: 69 63 65 20 2a 2f 0a 09 09 09 09 72 6f 75 74 65 ice */.....route
a330: 2e 72 74 5f 64 65 76 20 3d 20 73 74 72 64 75 70 .rt_dev = strdup
a340: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
a350: 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a 29 29 3b ption_val_obj));
a360: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
a370: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 54 63 6c default:.....Tcl
a380: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
a390: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
a3a0: 6e 74 66 28 22 62 61 64 20 6f 70 74 69 6f 6e 20 ntf("bad option
a3b0: 5c 22 25 73 5c 22 3a 20 6d 75 73 74 20 62 65 20 \"%s\": must be
a3c0: 67 61 74 65 77 61 79 2c 20 6d 74 75 2c 20 6d 65 gateway, mtu, me
a3d0: 74 72 69 63 2c 20 64 65 76 69 63 65 2c 20 6f 72 tric, device, or
a3e0: 20 77 69 6e 64 6f 77 22 2c 20 54 63 6c 5f 47 65 window", Tcl_Ge
a3f0: 74 53 74 72 69 6e 67 28 6f 70 74 69 6f 6e 5f 6e tString(option_n
a400: 61 6d 65 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 ame_obj)));.....
a410: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
a420: 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 R);...}..}.../*
a430: 52 65 71 75 65 73 74 20 72 6f 75 74 65 20 63 68 Request route ch
a440: 61 6e 67 65 20 2a 2f 0a 09 69 6f 63 74 6c 5f 72 ange */..ioctl_r
a450: 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c et = ioctl(sock,
a460: 20 69 6f 63 74 6c 5f 69 64 2c 20 26 72 6f 75 74 ioctl_id, &rout
a470: 65 29 3b 0a 09 69 66 20 28 69 6f 63 74 6c 5f 72 e);..if (ioctl_r
a480: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c et != 0) {...Tcl
a490: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
a4a0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 terp, Tcl_NewStr
a4b0: 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 ingObj(strerror(
a4c0: 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 errno), -1));...
a4d0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
a4e0: 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 R);..}...return(
a4f0: 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 TCL_OK);.}..stat
a500: 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 65 6d ic int tclsystem
a510: 5f 72 6f 75 74 65 28 43 6c 69 65 6e 74 44 61 74 _route(ClientDat
a520: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 a cd, Tcl_Interp
a530: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
a540: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e jc, Tcl_Obj *CON
a550: 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 69 6e ST objv[]) {..in
a560: 74 20 73 6f 63 6b 5f 76 34 2c 20 73 6f 63 6b 5f t sock_v4, sock_
a570: 76 36 2c 20 73 6f 63 6b 3b 0a 09 69 6e 74 20 72 v6, sock;..int r
a580: 65 74 76 61 6c 20 3d 20 54 43 4c 5f 45 52 52 4f etval = TCL_ERRO
a590: 52 3b 0a 0a 09 73 6f 63 6b 20 3d 20 74 63 6c 73 R;...sock = tcls
a5a0: 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 67 ystem_internal_g
a5b0: 65 74 73 6f 63 6b 28 26 73 6f 63 6b 5f 76 34 2c etsock(&sock_v4,
a5c0: 20 26 73 6f 63 6b 5f 76 36 29 3b 0a 09 69 66 20 &sock_v6);..if
a5d0: 28 73 6f 63 6b 20 3d 3d 20 2d 31 29 20 7b 0a 09 (sock == -1) {..
a5e0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
a5f0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
a600: 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 wStringObj("unab
a610: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 73 6f 63 le to create soc
a620: 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 ket", -1));....r
a630: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
a640: 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 6f ;..}...switch (o
a650: 62 6a 63 29 20 7b 0a 09 09 63 61 73 65 20 30 3a bjc) {...case 0:
a660: 0a 09 09 63 61 73 65 20 31 3a 20 2f 2a 20 4e 6f ...case 1: /* No
a670: 20 61 72 67 75 6d 65 6e 74 73 2c 20 6c 69 73 74 arguments, list
a680: 20 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 73 20 all interfaces
a690: 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 74 */....retval = t
a6a0: 63 6c 73 79 73 74 65 6d 5f 72 6f 75 74 65 5f 6c clsystem_route_l
a6b0: 69 73 74 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 ist(cd, interp,
a6c0: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63 6b objc, objv, sock
a6d0: 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 29 3b 0a 0a _v4, sock_v6);..
a6e0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 ...break;...defa
a6f0: 75 6c 74 3a 0a 09 09 09 2f 2a 20 4f 74 68 65 72 ult:..../* Other
a700: 77 69 73 65 2c 20 6d 6f 64 69 66 79 20 72 6f 75 wise, modify rou
a710: 74 65 73 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c tes */....retval
a720: 20 3d 20 74 63 6c 73 79 73 74 65 6d 5f 72 6f 75 = tclsystem_rou
a730: 74 65 5f 63 6f 6e 66 28 63 64 2c 20 69 6e 74 65 te_conf(cd, inte
a740: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 rp, objc, objv,
a750: 73 6f 63 6b 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 sock_v4, sock_v6
a760: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d );.....break;..}
a770: 0a 0a 09 2f 2a 20 43 6c 65 61 6e 75 70 20 2a 2f .../* Cleanup */
a780: 0a 09 69 66 20 28 73 6f 63 6b 5f 76 34 20 21 3d ..if (sock_v4 !=
a790: 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 73 65 28 73 -1) {...close(s
a7a0: 6f 63 6b 5f 76 34 29 3b 0a 09 7d 0a 0a 09 69 66 ock_v4);..}...if
a7b0: 20 28 73 6f 63 6b 5f 76 36 20 21 3d 20 2d 31 29 (sock_v6 != -1)
a7c0: 20 7b 0a 09 09 63 6c 6f 73 65 28 73 6f 63 6b 5f {...close(sock_
a7d0: 76 36 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e v6);..}...return
a7e0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 (retval);.}..sta
a7f0: 74 69 63 20 69 6e 74 20 74 63 6c 73 79 73 74 65 tic int tclsyste
a800: 6d 5f 62 72 63 74 6c 5f 6c 69 73 74 28 43 6c 69 m_brctl_list(Cli
a810: 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f entData cd, Tcl_
a820: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
a830: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
a840: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c j *CONST objv[],
a850: 20 69 6e 74 20 73 6f 63 6b 29 20 7b 0a 09 54 63 int sock) {..Tc
a860: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
a870: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
a880: 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 20 69 6d 70 ringObj("not imp
a890: 6c 65 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29 3b lemented", -1));
a8a0: 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ...return(TCL_ER
a8b0: 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 ROR);.}..static
a8c0: 69 6e 74 20 74 63 6c 73 79 73 74 65 6d 5f 62 72 int tclsystem_br
a8d0: 63 74 6c 5f 63 6f 6e 66 28 43 6c 69 65 6e 74 44 ctl_conf(ClientD
a8e0: 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 ata cd, Tcl_Inte
a8f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
a900: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 objc, Tcl_Obj *C
a910: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 ONST objv[], int
a920: 20 73 6f 63 6b 29 20 7b 0a 09 54 63 6c 5f 4f 62 sock) {..Tcl_Ob
a930: 6a 20 2a 6f 70 65 72 61 74 69 6f 6e 5f 6f 62 6a j *operation_obj
a940: 2c 20 2a 62 72 69 64 67 65 5f 6e 61 6d 65 5f 6f , *bridge_name_o
a950: 62 6a 2c 20 2a 69 6e 74 65 72 66 61 63 65 5f 6e bj, *interface_n
a960: 61 6d 65 5f 6f 62 6a 3b 0a 09 75 6e 73 69 67 6e ame_obj;..unsign
a970: 65 64 20 6c 6f 6e 67 20 61 72 67 5b 34 5d 3b 0a ed long arg[4];.
a980: 09 73 74 72 75 63 74 20 69 66 72 65 71 20 69 66 .struct ifreq if
a990: 72 3b 0a 09 69 6e 74 20 69 6f 63 74 6c 5f 72 65 r;..int ioctl_re
a9a0: 74 2c 20 69 6f 63 74 6c 5f 69 64 3b 0a 09 69 6e t, ioctl_id;..in
a9b0: 74 20 61 64 64 20 3d 20 30 3b 0a 0a 09 2f 2a 20 t add = 0;.../*
a9c0: 44 65 74 65 72 6d 69 6e 65 20 6f 70 65 72 61 74 Determine operat
a9d0: 69 6f 6e 20 2a 2f 0a 09 6f 70 65 72 61 74 69 6f ion */..operatio
a9e0: 6e 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b n_obj = objv[1];
a9f0: 0a 09 73 77 69 74 63 68 20 28 74 63 6c 73 79 73 ..switch (tclsys
aa00: 74 65 6d 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d tem_internal_sim
aa10: 70 6c 65 68 61 73 68 5f 6f 62 6a 28 6f 70 65 72 plehash_obj(oper
aa20: 61 74 69 6f 6e 5f 6f 62 6a 29 29 20 7b 0a 09 09 ation_obj)) {...
aa30: 63 61 73 65 20 30 78 31 63 39 39 33 32 37 32 3a case 0x1c993272:
aa40: 20 2f 2a 20 61 64 64 62 72 20 2a 2f 0a 09 09 09 /* addbr */....
aa50: 61 64 64 20 3d 20 31 3b 0a 09 09 63 61 73 65 20 add = 1;...case
aa60: 30 78 34 63 62 62 33 32 37 32 3a 20 2f 2a 20 64 0x4cbb3272: /* d
aa70: 65 6c 62 72 20 2a 2f 0a 09 09 09 69 66 20 28 6f elbr */....if (o
aa80: 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 09 09 09 bjc != 3) {.....
aa90: 69 66 20 28 61 64 64 29 20 7b 0a 09 09 09 09 09 if (add) {......
aaa0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
aab0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
aac0: 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 StringObj("wrong
aad0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 # args: should
aae0: 62 65 20 5c 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 be \"::system::s
aaf0: 79 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 20 61 64 yscall::brctl ad
ab00: 64 62 72 20 62 72 69 64 67 65 5c 22 22 2c 20 2d dbr bridge\"", -
ab10: 31 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 1));.....} else
ab20: 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 {......Tcl_SetOb
ab30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
ab40: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ab50: 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 ("wrong # args:
ab60: 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 73 79 should be \"::sy
ab70: 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 62 stem::syscall::b
ab80: 72 63 74 6c 20 64 65 6c 62 72 20 62 72 69 64 67 rctl delbr bridg
ab90: 65 5c 22 22 2c 20 2d 31 29 29 3b 0a 09 09 09 09 e\"", -1));.....
aba0: 7d 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43 }......return(TC
abb0: 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a L_ERROR);....}..
abc0: 09 09 09 62 72 69 64 67 65 5f 6e 61 6d 65 5f 6f ...bridge_name_o
abd0: 62 6a 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 0a 09 bj = objv[2];...
abe0: 09 09 69 66 20 28 61 64 64 29 20 7b 0a 09 09 09 ..if (add) {....
abf0: 09 61 72 67 5b 30 5d 20 3d 20 42 52 43 54 4c 5f .arg[0] = BRCTL_
ac00: 41 44 44 5f 42 52 49 44 47 45 3b 0a 09 09 09 7d ADD_BRIDGE;....}
ac10: 20 65 6c 73 65 20 7b 0a 09 09 09 09 61 72 67 5b else {.....arg[
ac20: 30 5d 20 3d 20 42 52 43 54 4c 5f 44 45 4c 5f 42 0] = BRCTL_DEL_B
ac30: 52 49 44 47 45 3b 0a 09 09 09 7d 0a 0a 09 09 09 RIDGE;....}.....
ac40: 61 72 67 5b 31 5d 20 3d 20 28 75 6e 73 69 67 6e arg[1] = (unsign
ac50: 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 ed long) Tcl_Get
ac60: 53 74 72 69 6e 67 28 62 72 69 64 67 65 5f 6e 61 String(bridge_na
ac70: 6d 65 5f 6f 62 6a 29 3b 0a 09 09 09 61 72 67 5b me_obj);....arg[
ac80: 32 5d 20 3d 20 30 3b 0a 0a 09 09 09 69 6f 63 74 2] = 0;.....ioct
ac90: 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f l_ret = ioctl(so
aca0: 63 6b 2c 20 53 49 4f 43 47 49 46 42 52 2c 20 26 ck, SIOCGIFBR, &
acb0: 61 72 67 29 3b 20 0a 0a 09 09 09 62 72 65 61 6b arg); .....break
acc0: 3b 0a 09 09 63 61 73 65 20 30 78 31 43 39 39 33 ;...case 0x1C993
acd0: 37 45 36 3a 20 2f 2a 20 61 64 64 69 66 20 2a 2f 7E6: /* addif */
ace0: 0a 09 09 09 61 64 64 20 3d 20 31 3b 0a 09 09 63 ....add = 1;...c
acf0: 61 73 65 20 30 78 34 63 62 62 33 37 65 36 3a 20 ase 0x4cbb37e6:
ad00: 2f 2a 20 64 65 6c 69 66 20 2a 2f 0a 09 09 09 69 /* delif */....i
ad10: 66 20 28 6f 62 6a 63 20 21 3d 20 34 29 20 7b 0a f (objc != 4) {.
ad20: 09 09 09 09 69 66 20 28 61 64 64 29 20 7b 0a 09 ....if (add) {..
ad30: 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 ....Tcl_SetObjRe
ad40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
ad50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 _NewStringObj("w
ad60: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f rong # args: sho
ad70: 75 6c 64 20 62 65 20 5c 22 3a 3a 73 79 73 74 65 uld be \"::syste
ad80: 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 62 72 63 74 m::syscall::brct
ad90: 6c 20 61 64 64 69 66 20 62 72 69 64 67 65 20 69 l addif bridge i
ada0: 6e 74 65 72 66 61 63 65 5c 22 22 2c 20 2d 31 29 nterface\"", -1)
adb0: 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a );.....} else {.
adc0: 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 .....Tcl_SetObjR
add0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
ade0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
adf0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 wrong # args: sh
ae00: 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 73 79 73 74 ould be \"::syst
ae10: 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 62 72 63 em::syscall::brc
ae20: 74 6c 20 64 65 6c 69 66 20 62 72 69 64 67 65 20 tl delif bridge
ae30: 69 6e 74 65 72 66 61 63 65 5c 22 22 2c 20 2d 31 interface\"", -1
ae40: 29 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 72 ));.....}......r
ae50: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
ae60: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 ;....}.....if (a
ae70: 64 64 29 20 7b 0a 09 09 09 09 69 6f 63 74 6c 5f dd) {.....ioctl_
ae80: 69 64 20 3d 20 53 49 4f 43 42 52 41 44 44 49 46 id = SIOCBRADDIF
ae90: 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ;....} else {...
aea0: 09 09 69 6f 63 74 6c 5f 69 64 20 3d 20 53 49 4f ..ioctl_id = SIO
aeb0: 43 42 52 44 45 4c 49 46 3b 0a 09 09 09 7d 0a 0a CBRDELIF;....}..
aec0: 09 09 09 62 72 69 64 67 65 5f 6e 61 6d 65 5f 6f ...bridge_name_o
aed0: 62 6a 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 09 bj = objv[2];...
aee0: 09 69 6e 74 65 72 66 61 63 65 5f 6e 61 6d 65 5f .interface_name_
aef0: 6f 62 6a 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 0a obj = objv[3];..
af00: 09 09 09 6d 65 6d 73 65 74 28 26 69 66 72 2c 20 ...memset(&ifr,
af10: 30 2c 20 73 69 7a 65 6f 66 28 69 66 72 29 29 3b 0, sizeof(ifr));
af20: 0a 09 09 09 73 6e 70 72 69 6e 74 66 28 69 66 72 ....snprintf(ifr
af30: 2e 69 66 72 5f 6e 61 6d 65 2c 20 49 46 4e 41 4d .ifr_name, IFNAM
af40: 53 49 5a 2c 20 22 25 73 22 2c 20 54 63 6c 5f 47 SIZ, "%s", Tcl_G
af50: 65 74 53 74 72 69 6e 67 28 69 6e 74 65 72 66 61 etString(interfa
af60: 63 65 5f 6e 61 6d 65 5f 6f 62 6a 29 29 3b 0a 0a ce_name_obj));..
af70: 09 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 ...ioctl_ret = i
af80: 6f 63 74 6c 28 73 6f 63 6b 2c 20 53 49 4f 43 47 octl(sock, SIOCG
af90: 49 46 49 4e 44 45 58 2c 20 28 76 6f 69 64 20 2a IFINDEX, (void *
afa0: 29 20 26 69 66 72 29 3b 0a 09 09 09 69 66 20 28 ) &ifr);....if (
afb0: 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 ioctl_ret == 0)
afc0: 7b 0a 09 09 09 09 73 6e 70 72 69 6e 74 66 28 69 {.....snprintf(i
afd0: 66 72 2e 69 66 72 5f 6e 61 6d 65 2c 20 49 46 4e fr.ifr_name, IFN
afe0: 41 4d 53 49 5a 2c 20 22 25 73 22 2c 20 54 63 6c AMSIZ, "%s", Tcl
aff0: 5f 47 65 74 53 74 72 69 6e 67 28 62 72 69 64 67 _GetString(bridg
b000: 65 5f 6e 61 6d 65 5f 6f 62 6a 29 29 3b 0a 09 09 e_name_obj));...
b010: 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f ..ioctl_ret = io
b020: 63 74 6c 28 73 6f 63 6b 2c 20 69 6f 63 74 6c 5f ctl(sock, ioctl_
b030: 69 64 2c 20 28 76 6f 69 64 20 2a 29 20 26 69 66 id, (void *) &if
b040: 72 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 r);....}.....bre
b050: 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 6f 63 ak;..}...if (ioc
b060: 74 6c 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 tl_ret < 0) {...
b070: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
b080: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
b090: 53 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 StringObj(strerr
b0a0: 6f 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b or(errno), -1));
b0b0: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 ....return(TCL_E
b0c0: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 RROR);..}...retu
b0d0: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 rn(TCL_OK);.}..s
b0e0: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 73 79 73 tatic int tclsys
b0f0: 74 65 6d 5f 62 72 63 74 6c 28 43 6c 69 65 6e 74 tem_brctl(Client
b100: 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 Data cd, Tcl_Int
b110: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
b120: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
b130: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a CONST objv[]) {.
b140: 09 69 6e 74 20 73 6f 63 6b 5f 76 34 2c 20 73 6f .int sock_v4, so
b150: 63 6b 5f 76 36 2c 20 73 6f 63 6b 3b 0a 09 69 6e ck_v6, sock;..in
b160: 74 20 72 65 74 76 61 6c 20 3d 20 54 43 4c 5f 45 t retval = TCL_E
b170: 52 52 4f 52 3b 0a 0a 09 73 6f 63 6b 20 3d 20 74 RROR;...sock = t
b180: 63 6c 73 79 73 74 65 6d 5f 69 6e 74 65 72 6e 61 clsystem_interna
b190: 6c 5f 67 65 74 73 6f 63 6b 28 26 73 6f 63 6b 5f l_getsock(&sock_
b1a0: 76 34 2c 20 26 73 6f 63 6b 5f 76 36 29 3b 0a 09 v4, &sock_v6);..
b1b0: 69 66 20 28 73 6f 63 6b 20 3d 3d 20 2d 31 29 20 if (sock == -1)
b1c0: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {...Tcl_SetObjRe
b1d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
b1e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 _NewStringObj("u
b1f0: 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 nable to create
b200: 73 6f 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 0a socket", -1));..
b210: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
b220: 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 OR);..}...switch
b230: 20 28 6f 62 6a 63 29 20 7b 0a 09 09 63 61 73 65 (objc) {...case
b240: 20 30 3a 0a 09 09 63 61 73 65 20 31 3a 20 2f 2a 0:...case 1: /*
b250: 20 4e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 6c No arguments, l
b260: 69 73 74 20 61 6c 6c 20 62 72 69 64 67 65 73 20 ist all bridges
b270: 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 74 */....retval = t
b280: 63 6c 73 79 73 74 65 6d 5f 62 72 63 74 6c 5f 6c clsystem_brctl_l
b290: 69 73 74 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 ist(cd, interp,
b2a0: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63 6b objc, objv, sock
b2b0: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 );.....break;...
b2c0: 64 65 66 61 75 6c 74 3a 0a 09 09 09 2f 2a 20 4f default:..../* O
b2d0: 74 68 65 72 77 69 73 65 2c 20 6d 6f 64 69 66 79 therwise, modify
b2e0: 20 72 6f 75 74 65 73 20 2a 2f 0a 09 09 09 72 65 routes */....re
b2f0: 74 76 61 6c 20 3d 20 74 63 6c 73 79 73 74 65 6d tval = tclsystem
b300: 5f 62 72 63 74 6c 5f 63 6f 6e 66 28 63 64 2c 20 _brctl_conf(cd,
b310: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
b320: 6a 76 2c 20 73 6f 63 6b 29 3b 0a 0a 09 09 09 62 jv, sock);.....b
b330: 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c reak;..}.../* Cl
b340: 65 61 6e 75 70 20 2a 2f 0a 09 69 66 20 28 73 6f eanup */..if (so
b350: 63 6b 5f 76 34 20 21 3d 20 2d 31 29 20 7b 0a 09 ck_v4 != -1) {..
b360: 09 63 6c 6f 73 65 28 73 6f 63 6b 5f 76 34 29 3b .close(sock_v4);
b370: 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 ..}...if (sock_v
b380: 36 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 6 != -1) {...clo
b390: 73 65 28 73 6f 63 6b 5f 76 36 29 3b 0a 09 7d 0a se(sock_v6);..}.
b3a0: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
b3b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 ;.}..static int
b3c0: 74 63 6c 73 79 73 74 65 6d 5f 76 63 6f 6e 66 69 tclsystem_vconfi
b3d0: 67 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c g(ClientData cd,
b3e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
b3f0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
b400: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 cl_Obj *CONST ob
b410: 6a 76 5b 5d 29 20 7b 0a 09 69 6e 74 20 73 6f 63 jv[]) {..int soc
b420: 6b 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 2c 20 73 k_v4, sock_v6, s
b430: 6f 63 6b 3b 0a 09 69 6e 74 20 72 65 74 76 61 6c ock;..int retval
b440: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 09 = TCL_ERROR;...
b450: 73 6f 63 6b 20 3d 20 74 63 6c 73 79 73 74 65 6d sock = tclsystem
b460: 5f 69 6e 74 65 72 6e 61 6c 5f 67 65 74 73 6f 63 _internal_getsoc
b470: 6b 28 26 73 6f 63 6b 5f 76 34 2c 20 26 73 6f 63 k(&sock_v4, &soc
b480: 6b 5f 76 36 29 3b 0a 09 69 66 20 28 73 6f 63 6b k_v6);..if (sock
b490: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 54 63 6c 5f == -1) {...Tcl_
b4a0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
b4b0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
b4c0: 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65 20 74 6f ngObj("unable to
b4d0: 20 63 72 65 61 74 65 20 73 6f 63 6b 65 74 22 2c create socket",
b4e0: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e -1));....return
b4f0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a (TCL_ERROR);..}.
b500: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
b510: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
b520: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 ewStringObj("not
b530: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d implemented", -
b540: 31 29 29 3b 0a 0a 09 2f 2a 20 43 6c 65 61 6e 75 1));.../* Cleanu
b550: 70 20 2a 2f 0a 09 69 66 20 28 73 6f 63 6b 5f 76 p */..if (sock_v
b560: 34 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 4 != -1) {...clo
b570: 73 65 28 73 6f 63 6b 5f 76 34 29 3b 0a 09 7d 0a se(sock_v4);..}.
b580: 0a 09 69 66 20 28 73 6f 63 6b 5f 76 36 20 21 3d ..if (sock_v6 !=
b590: 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 73 65 28 73 -1) {...close(s
b5a0: 6f 63 6b 5f 76 36 29 3b 0a 09 7d 0a 0a 09 72 65 ock_v6);..}...re
b5b0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a turn(retval);.}.
b5c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 73 .static int tcls
b5d0: 79 73 74 65 6d 5f 74 73 6d 66 5f 73 74 61 72 74 ystem_tsmf_start
b5e0: 5f 73 76 63 28 43 6c 69 65 6e 74 44 61 74 61 20 _svc(ClientData
b5f0: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a cd, Tcl_Interp *
b600: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
b610: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 , Tcl_Obj *CONST
b620: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 73 74 72 75 objv[]) {..stru
b630: 63 74 20 74 69 6d 65 76 61 6c 20 73 65 6c 65 63 ct timeval selec
b640: 74 5f 74 69 6d 65 6f 75 74 3b 0a 09 54 63 6c 5f t_timeout;..Tcl_
b650: 57 69 64 65 49 6e 74 20 75 6d 61 73 6b 5f 76 61 WideInt umask_va
b660: 6c 2c 20 74 69 6d 65 6f 75 74 5f 76 61 6c 3b 0a l, timeout_val;.
b670: 09 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61 .Tcl_Obj *filena
b680: 6d 65 5f 6f 62 6a 2c 20 2a 65 6e 76 5f 6f 62 6a me_obj, *env_obj
b690: 2c 20 2a 6c 6f 67 66 69 6c 65 5f 6f 62 6a 2c 20 , *logfile_obj,
b6a0: 2a 2a 65 6e 76 5f 65 6e 74 72 79 5f 6f 62 6a 76 **env_entry_objv
b6b0: 2c 20 2a 63 77 64 5f 6f 62 6a 2c 20 2a 75 6d 61 , *cwd_obj, *uma
b6c0: 73 6b 5f 6f 62 6a 2c 20 2a 75 73 65 72 5f 6f 62 sk_obj, *user_ob
b6d0: 6a 2c 20 2a 67 72 6f 75 70 5f 6f 62 6a 3b 0a 09 j, *group_obj;..
b6e0: 54 63 6c 5f 4f 62 6a 20 2a 73 72 69 5f 6f 62 6a Tcl_Obj *sri_obj
b6f0: 2c 20 2a 74 69 6d 65 6f 75 74 5f 6f 62 6a 3b 0a , *timeout_obj;.
b700: 09 70 69 64 5f 74 20 63 68 69 6c 64 2c 20 63 68 .pid_t child, ch
b710: 69 6c 64 5f 70 67 69 64 20 3d 20 2d 31 3b 0a 09 ild_pgid = -1;..
b720: 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 ssize_t read_ret
b730: 3b 0a 09 74 69 6d 65 5f 74 20 63 75 72 72 74 69 ;..time_t currti
b740: 6d 65 3b 0a 09 63 68 61 72 20 2a 61 72 67 76 5b me;..char *argv[
b750: 33 5d 2c 20 2a 65 6e 76 76 5b 35 31 32 5d 3b 0a 3], *envv[512];.
b760: 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 2c 20 .char *logfile,
b770: 2a 66 69 6c 65 6e 61 6d 65 2c 20 2a 63 77 64 2c *filename, *cwd,
b780: 20 2a 75 73 65 72 2c 20 2a 67 72 6f 75 70 3b 0a *user, *group;.
b790: 09 63 68 61 72 20 6c 6f 67 6d 73 67 5b 32 30 34 .char logmsg[204
b7a0: 38 5d 3b 0a 09 66 64 5f 73 65 74 20 72 65 61 64 8];..fd_set read
b7b0: 5f 66 64 73 65 74 3b 0a 09 69 6e 74 20 70 69 70 _fdset;..int pip
b7c0: 65 5f 72 65 74 2c 20 73 65 74 73 69 64 5f 72 65 e_ret, setsid_re
b7d0: 74 2c 20 65 78 65 63 76 65 5f 72 65 74 2c 20 74 t, execve_ret, t
b7e0: 63 6c 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 cl_ret, select_r
b7f0: 65 74 3b 0a 09 69 6e 74 20 6e 75 6c 6c 5f 66 64 et;..int null_fd
b800: 2c 20 6c 6f 67 5f 66 64 2c 20 74 6d 70 5f 66 64 , log_fd, tmp_fd
b810: 2c 20 6d 61 78 5f 66 64 3b 0a 09 69 6e 74 20 65 , max_fd;..int e
b820: 6e 76 5f 65 6e 74 72 79 5f 6f 62 6a 63 3b 0a 09 nv_entry_objc;..
b830: 69 6e 74 20 66 64 73 5b 32 5d 2c 20 66 64 3b 0a int fds[2], fd;.
b840: 09 69 6e 74 20 73 74 61 74 75 73 3b 0a 09 69 6e .int status;..in
b850: 74 20 69 64 78 3b 0a 0a 09 2f 2a 20 31 2e 20 50 t idx;.../* 1. P
b860: 61 72 73 65 20 61 72 67 75 6d 65 6e 74 73 20 2a arse arguments *
b870: 2f 0a 09 2f 2a 20 31 2e 61 2e 20 45 6e 73 75 72 /../* 1.a. Ensur
b880: 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 e the correct nu
b890: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
b8a0: 73 20 77 65 72 65 20 70 61 73 73 65 64 20 2a 2f s were passed */
b8b0: 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 30 ..if (objc != 10
b8c0: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a ) {...Tcl_SetObj
b8d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
b8e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
b8f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 "wrong # args: s
b900: 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 73 79 73 hould be \"::sys
b910: 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 74 73 tem::syscall::ts
b920: 6d 66 5f 73 74 61 72 74 5f 73 76 63 20 73 72 69 mf_start_svc sri
b930: 20 66 69 6c 65 6e 61 6d 65 20 6c 6f 67 66 69 6c filename logfil
b940: 65 20 65 6e 76 20 63 77 64 20 75 6d 61 73 6b 20 e env cwd umask
b950: 75 73 65 72 20 67 72 6f 75 70 20 74 69 6d 65 6f user group timeo
b960: 75 74 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 ut\"", -1));....
b970: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
b980: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 31 2e 62 2e 20 );..}.../* 1.b.
b990: 49 64 65 6e 74 69 66 79 20 54 63 6c 5f 4f 62 6a Identify Tcl_Obj
b9a0: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 s to use for eac
b9b0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 09 73 h argument */..s
b9c0: 72 69 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d ri_obj = objv[1]
b9d0: 3b 0a 09 66 69 6c 65 6e 61 6d 65 5f 6f 62 6a 20 ;..filename_obj
b9e0: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 6c 6f 67 66 = objv[2];..logf
b9f0: 69 6c 65 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 33 ile_obj = objv[3
ba00: 5d 3b 0a 09 65 6e 76 5f 6f 62 6a 20 3d 20 6f 62 ];..env_obj = ob
ba10: 6a 76 5b 34 5d 3b 0a 09 63 77 64 5f 6f 62 6a 20 jv[4];..cwd_obj
ba20: 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 09 75 6d 61 73 = objv[5];..umas
ba30: 6b 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 36 5d 3b k_obj = objv[6];
ba40: 0a 09 75 73 65 72 5f 6f 62 6a 20 3d 20 6f 62 6a ..user_obj = obj
ba50: 76 5b 37 5d 3b 0a 09 67 72 6f 75 70 5f 6f 62 6a v[7];..group_obj
ba60: 20 3d 20 6f 62 6a 76 5b 38 5d 3b 0a 09 74 69 6d = objv[8];..tim
ba70: 65 6f 75 74 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b eout_obj = objv[
ba80: 39 5d 3b 0a 0a 09 2f 2a 20 31 2e 63 2e 20 53 74 9];.../* 1.c. St
ba90: 6f 72 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d ore string argum
baa0: 65 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 6e 61 6d ents */..filenam
bab0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
bac0: 67 28 66 69 6c 65 6e 61 6d 65 5f 6f 62 6a 29 3b g(filename_obj);
bad0: 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 54 63 6c 5f ..logfile = Tcl_
bae0: 47 65 74 53 74 72 69 6e 67 28 6c 6f 67 66 69 6c GetString(logfil
baf0: 65 5f 6f 62 6a 29 3b 0a 09 63 77 64 20 3d 20 54 e_obj);..cwd = T
bb00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 63 77 64 cl_GetString(cwd
bb10: 5f 6f 62 6a 29 3b 0a 09 75 73 65 72 20 3d 20 54 _obj);..user = T
bb20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 75 73 65 cl_GetString(use
bb30: 72 5f 6f 62 6a 29 3b 0a 09 67 72 6f 75 70 20 3d r_obj);..group =
bb40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 67 Tcl_GetString(g
bb50: 72 6f 75 70 5f 6f 62 6a 29 3b 0a 0a 09 2f 2a 20 roup_obj);.../*
bb60: 31 2e 64 2e 20 49 6e 74 65 67 65 72 20 6f 62 6a 1.d. Integer obj
bb70: 65 63 74 73 20 2a 2f 0a 09 74 63 6c 5f 72 65 74 ects */..tcl_ret
bb80: 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e = Tcl_GetWideIn
bb90: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
bba0: 20 75 6d 61 73 6b 5f 6f 62 6a 2c 20 26 75 6d 61 umask_obj, &uma
bbb0: 73 6b 5f 76 61 6c 29 3b 0a 09 69 66 20 28 74 63 sk_val);..if (tc
bbc0: 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 l_ret != TCL_OK)
bbd0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 74 63 6c 5f {...return(tcl_
bbe0: 72 65 74 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 ret);..}...tcl_r
bbf0: 65 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 et = Tcl_GetWide
bc00: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
bc10: 70 2c 20 74 69 6d 65 6f 75 74 5f 6f 62 6a 2c 20 p, timeout_obj,
bc20: 26 74 69 6d 65 6f 75 74 5f 76 61 6c 29 3b 0a 09 &timeout_val);..
bc30: 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 if (tcl_ret != T
bc40: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
bc50: 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09 7d 0a 0a n(tcl_ret);..}..
bc60: 09 2f 2a 20 31 2e 65 2e 20 50 72 6f 63 65 73 73 ./* 1.e. Process
bc70: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 2a 2f 0a environment */.
bc80: 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 4c .tcl_ret = Tcl_L
bc90: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
bca0: 73 28 69 6e 74 65 72 70 2c 20 65 6e 76 5f 6f 62 s(interp, env_ob
bcb0: 6a 2c 20 26 65 6e 76 5f 65 6e 74 72 79 5f 6f 62 j, &env_entry_ob
bcc0: 6a 63 2c 20 26 65 6e 76 5f 65 6e 74 72 79 5f 6f jc, &env_entry_o
bcd0: 62 6a 76 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 bjv);..if (tcl_r
bce0: 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a et != TCL_OK) {.
bcf0: 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 ..return(tcl_ret
bd00: 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 );..}...for (idx
bd10: 20 3d 20 30 3b 20 69 64 78 20 3c 20 4d 49 4e 28 = 0; idx < MIN(
bd20: 65 6e 76 5f 65 6e 74 72 79 5f 6f 62 6a 63 2c 20 env_entry_objc,
bd30: 73 69 7a 65 6f 66 28 65 6e 76 76 29 20 2f 20 73 sizeof(envv) / s
bd40: 69 7a 65 6f 66 28 65 6e 76 76 5b 30 5d 29 20 2d izeof(envv[0]) -
bd50: 20 31 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 1); idx++) {...
bd60: 65 6e 76 76 5b 69 64 78 5d 20 3d 20 54 63 6c 5f envv[idx] = Tcl_
bd70: 47 65 74 53 74 72 69 6e 67 28 65 6e 76 5f 65 6e GetString(env_en
bd80: 74 72 79 5f 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a try_objv[idx]);.
bd90: 09 7d 0a 09 65 6e 76 76 5b 69 64 78 5d 20 3d 20 .}..envv[idx] =
bda0: 4e 55 4c 4c 3b 0a 0a 09 2f 2a 20 32 2e 20 43 72 NULL;.../* 2. Cr
bdb0: 65 61 74 65 20 61 20 70 69 70 65 20 66 6f 72 20 eate a pipe for
bdc0: 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 62 65 communication be
bdd0: 74 77 65 65 6e 20 74 68 65 20 70 72 6f 63 65 73 tween the proces
bde0: 73 65 73 20 2a 2f 0a 09 70 69 70 65 5f 72 65 74 ses */..pipe_ret
bdf0: 20 3d 20 70 69 70 65 28 66 64 73 29 3b 0a 09 69 = pipe(fds);..i
be00: 66 20 28 70 69 70 65 5f 72 65 74 20 21 3d 20 30 f (pipe_ret != 0
be10: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a ) {...Tcl_SetObj
be20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
be30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
be40: 22 70 69 70 65 20 66 61 69 6c 65 64 22 2c 20 2d "pipe failed", -
be50: 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 1));....return(T
be60: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 CL_ERROR);..}...
be70: 2f 2a 20 33 2e 20 46 6f 72 6b 20 69 6e 74 6f 20 /* 3. Fork into
be80: 61 20 6e 65 77 20 70 72 6f 63 65 73 73 20 2a 2f a new process */
be90: 0a 09 63 68 69 6c 64 20 3d 20 66 6f 72 6b 28 29 ..child = fork()
bea0: 3b 0a 09 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 ;..if (child ==
beb0: 28 28 70 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a ((pid_t) -1)) {.
bec0: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
bed0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
bee0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 6f 72 ewStringObj("for
bef0: 6b 20 66 61 69 6c 65 64 22 2c 20 2d 31 29 29 3b k failed", -1));
bf00: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 ....return(TCL_E
bf10: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
bf20: 63 68 69 6c 64 20 21 3d 20 30 29 20 7b 0a 09 09 child != 0) {...
bf30: 2f 2a 20 34 2e 70 61 72 65 6e 74 2e 20 47 65 74 /* 4.parent. Get
bf40: 20 50 47 49 44 20 66 72 6f 6d 20 63 68 69 6c 64 PGID from child
bf50: 20 2a 2f 0a 09 09 2f 2a 20 34 2e 70 61 72 65 6e */.../* 4.paren
bf60: 74 2e 61 2e 20 43 6c 6f 73 65 20 77 72 69 74 65 t.a. Close write
bf70: 20 65 6e 64 20 6f 66 20 70 69 70 65 20 2d 2d 20 end of pipe --
bf80: 77 65 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 we are read-only
bf90: 20 2a 2f 0a 09 09 63 6c 6f 73 65 28 66 64 73 5b */...close(fds[
bfa0: 31 5d 29 3b 0a 09 09 66 64 20 3d 20 66 64 73 5b 1]);...fd = fds[
bfb0: 30 5d 3b 0a 0a 09 09 2f 2a 20 34 2e 70 61 72 65 0];..../* 4.pare
bfc0: 6e 74 2e 62 2e 20 52 65 61 64 20 70 72 6f 63 65 nt.b. Read proce
bfd0: 73 73 20 67 72 6f 75 70 20 49 44 20 6f 66 20 63 ss group ID of c
bfe0: 68 69 6c 64 20 66 72 6f 6d 20 70 69 70 65 20 2a hild from pipe *
bff0: 2f 0a 09 09 73 65 6c 65 63 74 5f 74 69 6d 65 6f /...select_timeo
c000: 75 74 2e 74 76 5f 73 65 63 20 3d 20 74 69 6d 65 ut.tv_sec = time
c010: 6f 75 74 5f 76 61 6c 3b 0a 09 09 73 65 6c 65 63 out_val;...selec
c020: 74 5f 74 69 6d 65 6f 75 74 2e 74 76 5f 75 73 65 t_timeout.tv_use
c030: 63 20 3d 20 30 3b 0a 0a 09 09 46 44 5f 5a 45 52 c = 0;....FD_ZER
c040: 4f 28 26 72 65 61 64 5f 66 64 73 65 74 29 3b 0a O(&read_fdset);.
c050: 09 09 46 44 5f 53 45 54 28 66 64 2c 20 26 72 65 ..FD_SET(fd, &re
c060: 61 64 5f 66 64 73 65 74 29 3b 0a 0a 09 09 73 65 ad_fdset);....se
c070: 6c 65 63 74 5f 72 65 74 20 3d 20 73 65 6c 65 63 lect_ret = selec
c080: 74 28 66 64 20 2b 20 31 2c 20 26 72 65 61 64 5f t(fd + 1, &read_
c090: 66 64 73 65 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c fdset, NULL, NUL
c0a0: 4c 2c 20 26 73 65 6c 65 63 74 5f 74 69 6d 65 6f L, &select_timeo
c0b0: 75 74 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 ut);...if (selec
c0c0: 74 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09 t_ret == 0) {...
c0d0: 09 2f 2a 20 4f 6e 20 74 69 6d 65 6f 75 74 2c 20 ./* On timeout,
c0e0: 74 65 72 6d 69 6e 61 74 65 20 73 74 61 72 74 69 terminate starti
c0f0: 6e 67 20 70 72 6f 63 65 73 73 20 2a 2f 0a 09 09 ng process */...
c100: 09 63 68 69 6c 64 5f 70 67 69 64 20 3d 20 67 65 .child_pgid = ge
c110: 74 70 67 69 64 28 63 68 69 6c 64 29 3b 0a 09 09 tpgid(child);...
c120: 09 69 66 20 28 63 68 69 6c 64 5f 70 67 69 64 20 .if (child_pgid
c130: 21 3d 20 28 28 70 69 64 5f 74 29 20 2d 31 29 29 != ((pid_t) -1))
c140: 20 7b 0a 09 09 09 09 6b 69 6c 6c 28 2d 63 68 69 {.....kill(-chi
c150: 6c 64 5f 70 67 69 64 2c 20 53 49 47 4b 49 4c 4c ld_pgid, SIGKILL
c160: 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 54 63 6c 5f );....}.....Tcl_
c170: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
c180: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
c190: 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c ngObj("timeout",
c1a0: 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 -1));.....retur
c1b0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 n(TCL_ERROR);...
c1c0: 7d 0a 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f }....if (select_
c1d0: 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 72 65 ret > 0) {....re
c1e0: 61 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66 64 ad_ret = read(fd
c1f0: 2c 20 26 63 68 69 6c 64 5f 70 67 69 64 2c 20 73 , &child_pgid, s
c200: 69 7a 65 6f 66 28 63 68 69 6c 64 5f 70 67 69 64 izeof(child_pgid
c210: 29 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 34 2e ));...}..../* 4.
c220: 70 61 72 65 6e 74 2e 63 2e 20 43 6c 6f 73 65 20 parent.c. Close
c230: 72 65 61 64 20 65 6e 64 20 6f 66 20 70 69 70 65 read end of pipe
c240: 20 2a 2f 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b */...close(fd);
c250: 0a 0a 09 09 2f 2a 20 34 2e 70 61 72 65 6e 74 2e ..../* 4.parent.
c260: 64 2e 20 56 65 72 69 66 79 20 72 65 61 64 20 77 d. Verify read w
c270: 61 73 20 6d 65 61 6e 69 6e 67 66 75 6c 20 2a 2f as meaningful */
c280: 0a 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 ...if (read_ret
c290: 21 3d 20 73 69 7a 65 6f 66 28 63 68 69 6c 64 5f != sizeof(child_
c2a0: 70 67 69 64 29 29 20 7b 0a 09 09 09 54 63 6c 5f pgid)) {....Tcl_
c2b0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
c2c0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
c2d0: 6e 67 4f 62 6a 28 22 66 61 69 6c 65 64 20 74 6f ngObj("failed to
c2e0: 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 communicate wit
c2f0: 68 20 73 74 61 72 74 65 64 20 73 65 72 76 69 63 h started servic
c300: 65 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 e", -1));.....re
c310: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
c320: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 34 2e 70 61 72 ...}..../* 4.par
c330: 65 6e 74 2e 65 2e 20 49 66 20 74 68 65 20 50 47 ent.e. If the PG
c340: 49 44 20 67 69 76 65 6e 20 69 73 20 61 63 74 75 ID given is actu
c350: 61 6c 6c 79 20 61 6e 20 65 72 72 6f 72 2c 20 72 ally an error, r
c360: 65 74 75 72 6e 20 65 72 72 6f 72 20 2a 2f 0a 09 eturn error */..
c370: 09 69 66 20 28 63 68 69 6c 64 5f 70 67 69 64 20 .if (child_pgid
c380: 3d 3d 20 28 28 70 69 64 5f 74 29 20 2d 31 29 29 == ((pid_t) -1))
c390: 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a {....Tcl_SetObj
c3a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
c3b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
c3c0: 22 73 65 72 76 69 63 65 20 66 61 69 6c 65 64 20 "service failed
c3d0: 74 6f 20 73 74 61 72 74 22 2c 20 2d 31 29 29 3b to start", -1));
c3e0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f .....return(TCL_
c3f0: 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 2f ERROR);...}..../
c400: 2a 20 34 2e 70 61 72 65 6e 74 2e 66 2e 20 52 65 * 4.parent.f. Re
c410: 74 75 72 6e 20 50 47 49 44 20 74 6f 20 54 63 6c turn PGID to Tcl
c420: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a */...Tcl_SetObj
c430: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
c440: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a cl_NewWideIntObj
c450: 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 63 ((Tcl_WideInt) c
c460: 68 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09 09 hild_pgid));....
c470: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
c480: 09 7d 0a 0a 09 2f 2a 20 34 2e 63 68 69 6c 64 2e .}.../* 4.child.
c490: 61 2e 20 43 6c 6f 73 65 20 72 65 61 64 20 65 6e a. Close read en
c4a0: 64 20 6f 66 20 70 69 70 65 20 2d 2d 20 77 65 20 d of pipe -- we
c4b0: 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 69 74 only write to it
c4c0: 20 2a 2f 0a 09 63 6c 6f 73 65 28 66 64 73 5b 30 */..close(fds[0
c4d0: 5d 29 3b 0a 09 66 64 20 3d 20 66 64 73 5b 31 5d ]);..fd = fds[1]
c4e0: 3b 0a 0a 09 2f 2a 20 35 2e 20 43 72 65 61 74 65 ;.../* 5. Create
c4f0: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 2a a new session *
c500: 2f 0a 09 73 65 74 73 69 64 5f 72 65 74 20 3d 20 /..setsid_ret =
c510: 73 65 74 73 69 64 28 29 3b 0a 09 69 66 20 28 73 setsid();..if (s
c520: 65 74 73 69 64 5f 72 65 74 20 3d 3d 20 28 28 70 etsid_ret == ((p
c530: 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 77 id_t) -1)) {...w
c540: 72 69 74 65 28 66 64 2c 20 26 63 68 69 6c 64 5f rite(fd, &child_
c550: 70 67 69 64 2c 20 73 69 7a 65 6f 66 28 63 68 69 pgid, sizeof(chi
c560: 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09 09 5f 65 ld_pgid));...._e
c570: 78 69 74 28 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 xit(0);..}.../*
c580: 36 2e 20 53 65 74 75 70 20 65 6e 76 69 72 6f 6e 6. Setup environ
c590: 6d 65 6e 74 20 2a 2f 0a 09 2f 2a 20 36 2e 61 2e ment */../* 6.a.
c5a0: 20 53 65 74 20 75 6d 61 73 6b 20 2a 2f 0a 09 75 Set umask */..u
c5b0: 6d 61 73 6b 28 75 6d 61 73 6b 5f 76 61 6c 29 3b mask(umask_val);
c5c0: 0a 0a 09 2f 2a 20 36 2e 62 2e 20 53 65 74 20 77 .../* 6.b. Set w
c5d0: 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 orking directory
c5e0: 20 2a 2f 0a 09 63 68 64 69 72 28 63 77 64 29 3b */..chdir(cwd);
c5f0: 0a 0a 09 2f 2a 20 36 2e 63 2e 20 4f 70 65 6e 20 .../* 6.c. Open
c600: 6c 6f 67 20 66 69 6c 65 20 66 6f 72 20 73 74 64 log file for std
c610: 65 72 72 20 61 6e 64 20 73 74 64 6f 75 74 20 2a err and stdout *
c620: 2f 0a 09 6c 6f 67 5f 66 64 20 3d 20 6f 70 65 6e /..log_fd = open
c630: 28 6c 6f 67 66 69 6c 65 2c 20 4f 5f 57 52 4f 4e (logfile, O_WRON
c640: 4c 59 20 7c 20 4f 5f 43 52 45 41 54 20 7c 20 4f LY | O_CREAT | O
c650: 5f 41 50 50 45 4e 44 2c 20 53 5f 49 52 55 53 52 _APPEND, S_IRUSR
c660: 20 7c 20 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 | S_IWUSR | S_I
c670: 52 47 52 50 20 7c 20 53 5f 49 52 4f 54 48 29 3b RGRP | S_IROTH);
c680: 0a 0a 09 2f 2a 20 36 2e 64 2e 20 4f 70 65 6e 20 .../* 6.d. Open
c690: 22 2f 64 65 76 2f 6e 75 6c 6c 22 20 66 6f 72 20 "/dev/null" for
c6a0: 73 74 64 69 6e 20 2a 2f 0a 09 6e 75 6c 6c 5f 66 stdin */..null_f
c6b0: 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e d = open("/dev/n
c6c0: 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b ull", O_RDONLY);
c6d0: 0a 09 69 66 20 28 6e 75 6c 6c 5f 66 64 20 3c 20 ..if (null_fd <
c6e0: 30 20 7c 7c 20 6c 6f 67 5f 66 64 20 3c 30 29 20 0 || log_fd <0)
c6f0: 7b 0a 09 09 77 72 69 74 65 28 66 64 2c 20 26 63 {...write(fd, &c
c700: 68 69 6c 64 5f 70 67 69 64 2c 20 73 69 7a 65 6f hild_pgid, sizeo
c710: 66 28 63 68 69 6c 64 5f 70 67 69 64 29 29 3b 0a f(child_pgid));.
c720: 0a 09 09 5f 65 78 69 74 28 30 29 3b 0a 09 7d 0a ..._exit(0);..}.
c730: 0a 09 2f 2a 20 36 2e 65 2e 20 52 65 64 69 72 65 ../* 6.e. Redire
c740: 63 74 20 73 74 64 69 6e 2c 20 73 74 64 6f 75 74 ct stdin, stdout
c750: 2c 20 61 6e 64 20 73 74 64 65 72 72 20 74 6f 20 , and stderr to
c760: 6e 75 6c 6c 2c 20 6c 6f 67 73 20 2a 2f 0a 09 64 null, logs */..d
c770: 75 70 32 28 6e 75 6c 6c 5f 66 64 2c 20 53 54 44 up2(null_fd, STD
c780: 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09 64 75 70 IN_FILENO);..dup
c790: 32 28 6c 6f 67 5f 66 64 2c 20 53 54 44 4f 55 54 2(log_fd, STDOUT
c7a0: 5f 46 49 4c 45 4e 4f 29 3b 0a 09 64 75 70 32 28 _FILENO);..dup2(
c7b0: 6c 6f 67 5f 66 64 2c 20 53 54 44 45 52 52 5f 46 log_fd, STDERR_F
c7c0: 49 4c 45 4e 4f 29 3b 0a 0a 09 63 6c 6f 73 65 28 ILENO);...close(
c7d0: 6e 75 6c 6c 5f 66 64 29 3b 0a 09 63 6c 6f 73 65 null_fd);..close
c7e0: 28 6c 6f 67 5f 66 64 29 3b 0a 0a 09 2f 2a 20 36 (log_fd);.../* 6
c7f0: 2e 66 2e 20 43 6c 6f 73 65 20 73 74 72 61 79 20 .f. Close stray
c800: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 file descriptors
c810: 20 2a 2f 0a 09 6d 61 78 5f 66 64 20 3d 20 4d 41 */..max_fd = MA
c820: 58 28 4d 41 58 28 4d 41 58 28 31 30 32 34 2c 20 X(MAX(MAX(1024,
c830: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 2c 20 53 STDIN_FILENO), S
c840: 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 2c 20 53 TDOUT_FILENO), S
c850: 54 44 45 52 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 TDERR_FILENO);..
c860: 66 6f 72 20 28 74 6d 70 5f 66 64 20 3d 20 30 3b for (tmp_fd = 0;
c870: 20 74 6d 70 5f 66 64 20 3c 20 6d 61 78 5f 66 64 tmp_fd < max_fd
c880: 3b 20 74 6d 70 5f 66 64 2b 2b 29 20 7b 0a 09 09 ; tmp_fd++) {...
c890: 69 66 20 28 74 6d 70 5f 66 64 20 3d 3d 20 53 54 if (tmp_fd == ST
c8a0: 44 49 4e 5f 46 49 4c 45 4e 4f 20 7c 7c 20 74 6d DIN_FILENO || tm
c8b0: 70 5f 66 64 20 3d 3d 20 53 54 44 4f 55 54 5f 46 p_fd == STDOUT_F
c8c0: 49 4c 45 4e 4f 20 7c 7c 20 74 6d 70 5f 66 64 20 ILENO || tmp_fd
c8d0: 3d 3d 20 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f == STDERR_FILENO
c8e0: 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b ) {....continue;
c8f0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 74 6d 70 5f ...}....if (tmp_
c900: 66 64 20 3d 3d 20 66 64 29 20 7b 0a 09 09 09 63 fd == fd) {....c
c910: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 ontinue;...}....
c920: 63 6c 6f 73 65 28 74 6d 70 5f 66 64 29 3b 0a 09 close(tmp_fd);..
c930: 7d 0a 0a 09 2f 2a 20 36 2e 67 2e 20 53 77 69 74 }.../* 6.g. Swit
c940: 63 68 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 ch to appropriat
c950: 65 20 75 73 65 72 2f 67 72 6f 75 70 20 2a 2f 0a e user/group */.
c960: 09 2f 2a 20 36 2e 67 2e 69 2e 20 47 72 6f 75 70 ./* 6.g.i. Group
c970: 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 */../* XXX: TOD
c980: 4f 20 2a 2f 0a 0a 09 2f 2a 20 36 2e 67 2e 69 69 O */.../* 6.g.ii
c990: 2e 20 55 73 65 72 20 2a 2f 0a 09 2f 2a 20 58 58 . User */../* XX
c9a0: 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 2f 2a 20 X: TODO */.../*
c9b0: 37 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 7. Create a new
c9c0: 70 72 6f 63 65 73 73 20 74 6f 20 61 63 74 75 61 process to actua
c9d0: 6c 6c 79 20 73 70 61 77 6e 20 74 68 65 20 70 72 lly spawn the pr
c9e0: 6f 63 65 73 73 20 2a 2f 0a 09 63 68 69 6c 64 20 ocess */..child
c9f0: 3d 20 66 6f 72 6b 28 29 3b 0a 09 69 66 20 28 63 = fork();..if (c
ca00: 68 69 6c 64 20 3d 3d 20 28 28 70 69 64 5f 74 29 hild == ((pid_t)
ca10: 20 2d 31 29 29 20 7b 0a 09 09 77 72 69 74 65 28 -1)) {...write(
ca20: 66 64 2c 20 26 63 68 69 6c 64 5f 70 67 69 64 2c fd, &child_pgid,
ca30: 20 73 69 7a 65 6f 66 28 63 68 69 6c 64 5f 70 67 sizeof(child_pg
ca40: 69 64 29 29 3b 0a 0a 09 09 5f 65 78 69 74 28 30 id));...._exit(0
ca50: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 68 69 6c );..}...if (chil
ca60: 64 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 37 d != 0) {.../* 7
ca70: 2e 70 61 72 65 6e 74 2e 61 2e 20 57 61 69 74 20 .parent.a. Wait
ca80: 66 6f 72 20 63 68 69 6c 64 20 70 72 6f 63 65 73 for child proces
ca90: 73 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 s to terminate a
caa0: 6e 64 20 63 6f 6c 6c 65 63 74 20 73 74 61 74 75 nd collect statu
cab0: 73 20 2a 2f 0a 09 09 77 61 69 74 70 69 64 28 63 s */...waitpid(c
cac0: 68 69 6c 64 2c 20 26 73 74 61 74 75 73 2c 20 30 hild, &status, 0
cad0: 29 3b 0a 0a 09 09 2f 2a 20 37 2e 70 61 72 65 6e );..../* 7.paren
cae0: 74 2e 62 2e 20 53 65 74 20 50 47 49 44 20 28 69 t.b. Set PGID (i
caf0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2d 31 f successful, -1
cb00: 20 6f 74 68 65 72 77 69 73 65 29 20 74 6f 20 70 otherwise) to p
cb10: 61 73 73 20 62 61 63 6b 20 74 6f 20 54 53 4d 46 ass back to TSMF
cb20: 20 2a 2f 0a 09 09 69 66 20 28 73 74 61 74 75 73 */...if (status
cb30: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 63 68 69 6c == 0) {....chil
cb40: 64 5f 70 67 69 64 20 3d 20 67 65 74 70 67 69 64 d_pgid = getpgid
cb50: 28 67 65 74 70 69 64 28 29 29 3b 0a 09 09 7d 0a (getpid());...}.
cb60: 09 09 77 72 69 74 65 28 66 64 2c 20 26 63 68 69 ..write(fd, &chi
cb70: 6c 64 5f 70 67 69 64 2c 20 73 69 7a 65 6f 66 28 ld_pgid, sizeof(
cb80: 63 68 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09 child_pgid));...
cb90: 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 2f .close(fd);..../
cba0: 2a 20 37 2e 70 61 72 65 6e 74 2e 63 2e 20 57 72 * 7.parent.c. Wr
cbb0: 69 74 65 20 6c 6f 67 20 6f 66 20 72 65 73 75 6c ite log of resul
cbc0: 74 20 2a 2f 0a 09 09 2f 2a 20 4e 6f 74 65 3a 20 t */.../* Note:
cbd0: 57 65 20 61 76 6f 69 64 20 41 4e 53 49 20 49 2f We avoid ANSI I/
cbe0: 4f 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 O here in case t
cbf0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 here is already
cc00: 73 6f 6d 65 74 68 69 6e 67 20 69 6e 20 74 68 65 something in the
cc10: 20 62 75 66 66 65 72 20 2a 2f 0a 09 09 63 75 72 buffer */...cur
cc20: 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c rtime = time(NUL
cc30: 4c 29 3b 0a 09 09 73 74 72 66 74 69 6d 65 28 6c L);...strftime(l
cc40: 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f ogmsg, sizeof(lo
cc50: 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25 65 20 gmsg), "[ %b %e
cc60: 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f 63 61 %H:%M:%S ", loca
cc70: 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d 65 29 ltime(&currtime)
cc80: 29 3b 0a 09 09 77 72 69 74 65 28 53 54 44 45 52 );...write(STDER
cc90: 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f 67 6d 73 67 R_FILENO, logmsg
cca0: 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 , strlen(logmsg)
ccb0: 29 3b 0a 0a 09 09 73 6e 70 72 69 6e 74 66 28 6c );....snprintf(l
ccc0: 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f ogmsg, sizeof(lo
ccd0: 67 6d 73 67 29 2c 20 22 4d 65 74 68 6f 64 20 5c gmsg), "Method \
cce0: 22 73 74 61 72 74 5c 22 20 65 78 69 74 65 64 20 "start\" exited
ccf0: 77 69 74 68 20 73 74 61 74 75 73 20 25 69 20 5d with status %i ]
cd00: 5c 6e 22 2c 20 57 45 58 49 54 53 54 41 54 55 53 \n", WEXITSTATUS
cd10: 28 73 74 61 74 75 73 29 29 3b 0a 09 09 77 72 69 (status));...wri
cd20: 74 65 28 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f te(STDERR_FILENO
cd30: 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72 6c 65 6e , logmsg, strlen
cd40: 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09 09 5f 65 (logmsg));...._e
cd50: 78 69 74 28 30 29 3b 0a 09 7d 0a 09 0a 09 2f 2a xit(0);..}..../*
cd60: 20 37 2e 63 68 69 6c 64 2e 61 2e 20 43 6c 6f 73 7.child.a. Clos
cd70: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 70 61 72 e channel to par
cd80: 65 6e 74 20 2a 2f 0a 09 63 6c 6f 73 65 28 66 64 ent */..close(fd
cd90: 29 3b 0a 0a 09 2f 2a 20 38 2e 20 4c 6f 67 20 61 );.../* 8. Log a
cda0: 74 74 65 6d 70 74 20 74 6f 20 72 75 6e 20 73 74 ttempt to run st
cdb0: 61 72 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 09 63 art method */..c
cdc0: 75 72 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e urrtime = time(N
cdd0: 55 4c 4c 29 3b 0a 09 73 74 72 66 74 69 6d 65 28 ULL);..strftime(
cde0: 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c logmsg, sizeof(l
cdf0: 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25 65 ogmsg), "[ %b %e
ce00: 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f 63 %H:%M:%S ", loc
ce10: 61 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d 65 altime(&currtime
ce20: 29 29 3b 0a 09 77 72 69 74 65 28 53 54 44 45 52 ));..write(STDER
ce30: 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f 67 6d 73 67 R_FILENO, logmsg
ce40: 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 , strlen(logmsg)
ce50: 29 3b 0a 0a 09 73 6e 70 72 69 6e 74 66 28 6c 6f );...snprintf(lo
ce60: 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 gmsg, sizeof(log
ce70: 6d 73 67 29 2c 20 22 45 78 65 63 75 74 69 6e 67 msg), "Executing
ce80: 20 73 74 61 72 74 20 6d 65 74 68 6f 64 20 28 5c start method (\
ce90: 22 25 73 5c 22 29 20 5d 5c 6e 22 2c 20 66 69 6c "%s\") ]\n", fil
cea0: 65 6e 61 6d 65 29 3b 0a 09 77 72 69 74 65 28 53 ename);..write(S
ceb0: 54 44 45 52 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f TDERR_FILENO, lo
cec0: 67 6d 73 67 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 gmsg, strlen(log
ced0: 6d 73 67 29 29 3b 0a 0a 09 2f 2a 20 39 2e 20 65 msg));.../* 9. e
cee0: 78 65 63 76 65 28 29 20 6e 65 77 20 69 6d 61 67 xecve() new imag
cef0: 65 20 2a 2f 0a 09 61 72 67 76 5b 30 5d 20 3d 20 e */..argv[0] =
cf00: 66 69 6c 65 6e 61 6d 65 3b 0a 09 61 72 67 76 5b filename;..argv[
cf10: 31 5d 20 3d 20 22 73 74 61 72 74 22 3b 0a 09 61 1] = "start";..a
cf20: 72 67 76 5b 32 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 rgv[2] = NULL;..
cf30: 65 78 65 63 76 65 5f 72 65 74 20 3d 20 65 78 65 execve_ret = exe
cf40: 63 76 65 28 66 69 6c 65 6e 61 6d 65 2c 20 61 72 cve(filename, ar
cf50: 67 76 2c 20 65 6e 76 76 29 3b 0a 0a 09 2f 2a 20 gv, envv);.../*
cf60: 31 30 2e 20 41 62 6f 72 74 20 69 66 20 73 6f 6d 10. Abort if som
cf70: 65 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 ething has gone
cf80: 77 72 6f 6e 67 20 2a 2f 0a 09 5f 65 78 69 74 28 wrong */.._exit(
cf90: 65 78 65 63 76 65 5f 72 65 74 29 3b 0a 7d 0a 0a execve_ret);.}..
cfa0: 69 6e 74 20 53 79 73 74 65 6d 5f 49 6e 69 74 28 int System_Init(
cfb0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
cfc0: 72 70 29 20 7b 0a 23 69 66 64 65 66 20 55 53 45 rp) {.#ifdef USE
cfd0: 5f 54 43 4c 5f 53 54 55 42 53 0a 09 63 6f 6e 73 _TCL_STUBS..cons
cfe0: 74 20 63 68 61 72 20 2a 74 63 6c 49 6e 69 74 53 t char *tclInitS
cff0: 74 75 62 73 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 tubs_ret;.../* I
d000: 6e 69 74 69 61 6c 69 7a 65 20 53 74 75 62 73 20 nitialize Stubs
d010: 2a 2f 0a 09 74 63 6c 49 6e 69 74 53 74 75 62 73 */..tclInitStubs
d020: 5f 72 65 74 20 3d 20 54 63 6c 5f 49 6e 69 74 53 _ret = Tcl_InitS
d030: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e tubs(interp, "8.
d040: 34 22 2c 20 30 29 3b 0a 09 69 66 20 28 21 74 63 4", 0);..if (!tc
d050: 6c 49 6e 69 74 53 74 75 62 73 5f 72 65 74 29 20 lInitStubs_ret)
d060: 7b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 {...return(TCL_E
d070: 52 52 4f 52 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 RROR);..}.#endif
d080: 0a 0a 09 2f 2a 20 4b 65 72 6e 65 6c 20 6d 61 69 .../* Kernel mai
d090: 6e 74 65 6e 61 6e 63 65 20 72 65 6c 61 74 65 64 ntenance related
d0a0: 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 09 54 63 commands */..Tc
d0b0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
d0c0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 73 79 nd(interp, "::sy
d0d0: 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69 stem::syscall::i
d0e0: 6e 73 6d 6f 64 22 2c 20 74 63 6c 73 79 73 74 65 nsmod", tclsyste
d0f0: 6d 5f 69 6e 73 6d 6f 64 2c 20 4e 55 4c 4c 2c 20 m_insmod, NULL,
d100: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 NULL);..Tcl_Crea
d110: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
d120: 65 72 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a erp, "::system::
d130: 73 79 73 63 61 6c 6c 3a 3a 72 6d 6d 6f 64 22 2c syscall::rmmod",
d140: 20 74 63 6c 73 79 73 74 65 6d 5f 72 6d 6d 6f 64 tclsystem_rmmod
d150: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
d160: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
d170: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
d180: 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a system::syscall:
d190: 3a 6c 73 6d 6f 64 22 2c 20 74 63 6c 73 79 73 74 :lsmod", tclsyst
d1a0: 65 6d 5f 6c 73 6d 6f 64 2c 20 4e 55 4c 4c 2c 20 em_lsmod, NULL,
d1b0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 NULL);..Tcl_Crea
d1c0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
d1d0: 65 72 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a erp, "::system::
d1e0: 73 79 73 63 61 6c 6c 3a 3a 68 6f 73 74 6e 61 6d syscall::hostnam
d1f0: 65 22 2c 20 74 63 6c 73 79 73 74 65 6d 5f 68 6f e", tclsystem_ho
d200: 73 74 6e 61 6d 65 2c 20 4e 55 4c 4c 2c 20 4e 55 stname, NULL, NU
d210: 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 LL);..Tcl_Create
d220: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
d230: 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 p, "::system::sy
d240: 73 63 61 6c 6c 3a 3a 64 6f 6d 61 69 6e 6e 61 6d scall::domainnam
d250: 65 22 2c 20 74 63 6c 73 79 73 74 65 6d 5f 64 6f e", tclsystem_do
d260: 6d 61 69 6e 6e 61 6d 65 2c 20 4e 55 4c 4c 2c 20 mainname, NULL,
d270: 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 42 6c 6f 63 NULL);.../* Bloc
d280: 6b 20 6f 72 20 63 68 61 72 20 64 65 76 69 63 65 k or char device
d290: 20 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64 related command
d2a0: 73 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 s */..Tcl_Create
d2b0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
d2c0: 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 p, "::system::sy
d2d0: 73 63 61 6c 6c 3a 3a 6c 6f 73 65 74 75 70 22 2c scall::losetup",
d2e0: 20 74 63 6c 73 79 73 74 65 6d 5f 6c 6f 73 65 74 tclsystem_loset
d2f0: 75 70 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b up, NULL, NULL);
d300: 0a 0a 09 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d .../* Filesystem
d310: 20 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64 related command
d320: 73 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 s */..Tcl_Create
d330: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
d340: 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 p, "::system::sy
d350: 73 63 61 6c 6c 3a 3a 6d 6f 75 6e 74 22 2c 20 74 scall::mount", t
d360: 63 6c 73 79 73 74 65 6d 5f 6d 6f 75 6e 74 2c 20 clsystem_mount,
d370: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 NULL, NULL);..Tc
d380: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
d390: 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 73 79 nd(interp, "::sy
d3a0: 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 75 stem::syscall::u
d3b0: 6d 6f 75 6e 74 22 2c 20 74 63 6c 73 79 73 74 65 mount", tclsyste
d3c0: 6d 5f 75 6d 6f 75 6e 74 2c 20 4e 55 4c 4c 2c 20 m_umount, NULL,
d3d0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 NULL);..Tcl_Crea
d3e0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
d3f0: 65 72 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a erp, "::system::
d400: 73 79 73 63 61 6c 6c 3a 3a 73 77 61 70 6f 6e 22 syscall::swapon"
d410: 2c 20 74 63 6c 73 79 73 74 65 6d 5f 73 77 61 70 , tclsystem_swap
d420: 6f 6e 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b on, NULL, NULL);
d430: 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 ..Tcl_CreateObjC
d440: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
d450: 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c ::system::syscal
d460: 6c 3a 3a 73 77 61 70 6f 66 66 22 2c 20 74 63 6c l::swapoff", tcl
d470: 73 79 73 74 65 6d 5f 73 77 61 70 6f 66 66 2c 20 system_swapoff,
d480: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 NULL, NULL);..Tc
d490: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
d4a0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 73 79 nd(interp, "::sy
d4b0: 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 6d stem::syscall::m
d4c0: 6b 6e 6f 64 22 2c 20 74 63 6c 73 79 73 74 65 6d knod", tclsystem
d4d0: 5f 6d 6b 6e 6f 64 2c 20 4e 55 4c 4c 2c 20 4e 55 _mknod, NULL, NU
d4e0: 4c 4c 29 3b 0a 0a 09 2f 2a 20 50 72 6f 63 65 73 LL);.../* Proces
d4f0: 73 20 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e s related comman
d500: 64 73 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 ds */..Tcl_Creat
d510: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
d520: 72 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 rp, "::system::s
d530: 79 73 63 61 6c 6c 3a 3a 67 65 74 75 69 64 22 2c yscall::getuid",
d540: 20 74 63 6c 73 79 73 74 65 6d 5f 67 65 74 75 69 tclsystem_getui
d550: 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a d, NULL, NULL);.
d560: 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f .Tcl_CreateObjCo
d570: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
d580: 3a 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c :system::syscall
d590: 3a 3a 63 68 72 6f 6f 74 22 2c 20 74 63 6c 73 79 ::chroot", tclsy
d5a0: 73 74 65 6d 5f 63 68 72 6f 6f 74 2c 20 4e 55 4c stem_chroot, NUL
d5b0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 L, NULL);..Tcl_C
d5c0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
d5d0: 69 6e 74 65 72 70 2c 20 22 3a 3a 73 79 73 74 65 interp, "::syste
d5e0: 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 70 69 76 6f m::syscall::pivo
d5f0: 74 5f 72 6f 6f 74 22 2c 20 74 63 6c 73 79 73 74 t_root", tclsyst
d600: 65 6d 5f 70 69 76 6f 74 5f 72 6f 6f 74 2c 20 4e em_pivot_root, N
d610: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c ULL, NULL);..Tcl
d620: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
d630: 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 73 79 73 d(interp, "::sys
d640: 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 6b 69 tem::syscall::ki
d650: 6c 6c 22 2c 20 74 63 6c 73 79 73 74 65 6d 5f 6b ll", tclsystem_k
d660: 69 6c 6c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ill, NULL, NULL)
d670: 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a ;..Tcl_CreateObj
d680: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
d690: 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 "::system::sysca
d6a0: 6c 6c 3a 3a 70 73 22 2c 20 74 63 6c 73 79 73 74 ll::ps", tclsyst
d6b0: 65 6d 5f 70 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c em_ps, NULL, NUL
d6c0: 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f L);..Tcl_CreateO
d6d0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
d6e0: 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 73 , "::system::sys
d6f0: 63 61 6c 6c 3a 3a 65 78 65 63 76 65 22 2c 20 74 call::execve", t
d700: 63 6c 73 79 73 74 65 6d 5f 65 78 65 63 76 65 2c clsystem_execve,
d710: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 NULL, NULL);...
d720: 2f 2a 20 4e 65 74 77 6f 72 6b 20 72 65 6c 61 74 /* Network relat
d730: 65 64 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 09 ed commands */..
d740: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
d750: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
d760: 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a system::syscall:
d770: 3a 69 66 63 6f 6e 66 69 67 22 2c 20 74 63 6c 73 :ifconfig", tcls
d780: 79 73 74 65 6d 5f 69 66 63 6f 6e 66 69 67 2c 20 ystem_ifconfig,
d790: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 NULL, NULL);..Tc
d7a0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
d7b0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 73 79 nd(interp, "::sy
d7c0: 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 72 stem::syscall::r
d7d0: 6f 75 74 65 22 2c 20 74 63 6c 73 79 73 74 65 6d oute", tclsystem
d7e0: 5f 72 6f 75 74 65 2c 20 4e 55 4c 4c 2c 20 4e 55 _route, NULL, NU
d7f0: 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 LL);..Tcl_Create
d800: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
d810: 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 p, "::system::sy
d820: 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 22 2c 20 74 scall::brctl", t
d830: 63 6c 73 79 73 74 65 6d 5f 62 72 63 74 6c 2c 20 clsystem_brctl,
d840: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 NULL, NULL);..Tc
d850: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
d860: 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 73 79 nd(interp, "::sy
d870: 73 74 65 6d 3a 3a 73 79 73 63 61 6c 6c 3a 3a 76 stem::syscall::v
d880: 63 6f 6e 66 69 67 22 2c 20 74 63 6c 73 79 73 74 config", tclsyst
d890: 65 6d 5f 76 63 6f 6e 66 69 67 2c 20 4e 55 4c 4c em_vconfig, NULL
d8a0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 53 65 , NULL);.../* Se
d8b0: 72 76 69 63 65 20 28 54 53 4d 46 29 20 72 65 6c rvice (TSMF) rel
d8c0: 61 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f ated commands */
d8d0: 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 ..Tcl_CreateObjC
d8e0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
d8f0: 3a 3a 73 79 73 74 65 6d 3a 3a 73 79 73 63 61 6c ::system::syscal
d900: 6c 3a 3a 74 73 6d 66 5f 73 74 61 72 74 5f 73 76 l::tsmf_start_sv
d910: 63 22 2c 20 74 63 6c 73 79 73 74 65 6d 5f 74 73 c", tclsystem_ts
d920: 6d 66 5f 73 74 61 72 74 5f 73 76 63 2c 20 4e 55 mf_start_svc, NU
d930: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 LL, NULL);.../*
d940: 49 6e 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f Internal functio
d950: 6e 73 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 ns */..Tcl_Creat
d960: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
d970: 72 70 2c 20 22 3a 3a 73 79 73 74 65 6d 3a 3a 69 rp, "::system::i
d980: 6e 74 65 72 6e 61 6c 3a 3a 68 61 73 68 22 2c 20 nternal::hash",
d990: 74 63 6c 73 79 73 74 65 6d 5f 69 6e 74 65 72 6e tclsystem_intern
d9a0: 61 6c 70 72 6f 63 5f 73 69 6d 70 6c 65 68 61 73 alproc_simplehas
d9b0: 68 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a h, NULL, NULL);.
d9c0: 0a 09 2f 2a 20 44 65 66 69 6e 65 20 63 6f 6e 73 ../* Define cons
d9d0: 74 61 6e 74 73 20 2a 2f 0a 09 2f 2a 2a 20 43 72 tants */../** Cr
d9e0: 65 61 74 65 20 70 61 72 65 6e 74 20 6e 61 6d 65 eate parent name
d9f0: 73 70 61 63 65 20 2a 2a 2f 0a 09 54 63 6c 5f 43 space **/..Tcl_C
da00: 72 65 61 74 65 4e 61 6d 65 73 70 61 63 65 28 69 reateNamespace(i
da10: 6e 74 65 72 70 2c 20 22 3a 3a 73 79 73 74 65 6d nterp, "::system
da20: 3a 3a 63 6f 6e 73 74 22 2c 20 4e 55 4c 4c 2c 20 ::const", NULL,
da30: 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 2a 20 44 65 66 NULL);.../** Def
da40: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 2c 20 66 ine constants, f
da50: 6f 72 20 72 65 61 6c 20 2a 2a 2f 0a 09 54 63 6c or real **/..Tcl
da60: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 _ObjSetVar2(inte
da70: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e rp, Tcl_NewStrin
da80: 67 4f 62 6a 28 22 3a 3a 73 79 73 74 65 6d 3a 3a gObj("::system::
da90: 63 6f 6e 73 74 3a 3a 48 4f 53 54 5f 4e 41 4d 45 const::HOST_NAME
daa0: 5f 4d 41 58 22 2c 20 2d 31 29 2c 20 4e 55 4c 4c _MAX", -1), NULL
dab0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 , Tcl_NewWideInt
dac0: 4f 62 6a 28 48 4f 53 54 5f 4e 41 4d 45 5f 4d 41 Obj(HOST_NAME_MA
dad0: 58 29 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f X), TCL_GLOBAL_O
dae0: 4e 4c 59 29 3b 0a 0a 09 2f 2a 20 43 72 65 61 74 NLY);.../* Creat
daf0: 65 20 68 69 67 68 2d 6c 65 76 65 6c 20 75 73 65 e high-level use
db00: 72 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09 r functions */..
db10: 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
db20: 0a 23 69 6e 63 6c 75 64 65 20 22 73 79 73 74 65 .#include "syste
db30: 6d 2e 74 63 6c 2e 68 22 20 0a 09 29 3b 0a 0a 09 m.tcl.h" ..);...
db40: 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 Tcl_PkgProvide(i
db50: 6e 74 65 72 70 2c 20 22 73 79 73 74 65 6d 22 2c nterp, "system",
db60: 20 22 30 2e 31 22 29 3b 0a 0a 09 72 65 74 75 72 "0.1");...retur
db70: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a n(TCL_OK);.}.