Hex Artifact Content

Artifact 1d6aabc455aacbe93f8fe5ef5bcc15e700635c59:


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);.}.