Hex Artifact Content

Artifact 5d107fd93d3ddc585d184e3a81e7cd21fda08fd7:


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 72 65 73 6f 75 72 63 65 2e 68   <sys/resource.h
0030: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0040: 73 79 73 63 61 6c 6c 2e 68 3e 0a 23 69 6e 63 6c  syscall.h>.#incl
0050: 75 64 65 20 3c 73 79 73 2f 74 65 72 6d 69 6f 73  ude <sys/termios
0060: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65  .h>.#include <ne
0070: 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a 23 69 6e 63  tinet/in.h>.#inc
0080: 6c 75 64 65 20 3c 73 79 73 2f 72 65 62 6f 6f 74  lude <sys/reboot
0090: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 72  .h>.#include <ar
00a0: 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69 6e 63 6c  pa/inet.h>.#incl
00b0: 75 64 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e  ude <sys/socket.
00c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
00d0: 2f 73 65 6c 65 63 74 2e 68 3e 0a 23 69 6e 63 6c  /select.h>.#incl
00e0: 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68  ude <sys/mount.h
00f0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0100: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  types.h>.#includ
0110: 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a  e <sys/ioctl.h>.
0120: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69  #include <sys/ti
0130: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
0140: 73 79 73 2f 6b 6c 6f 67 2e 68 3e 0a 23 69 6e 63  sys/klog.h>.#inc
0150: 6c 75 64 65 20 3c 73 79 73 2f 73 77 61 70 2e 68  lude <sys/swap.h
0160: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0170: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  stat.h>.#include
0180: 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 69   <sys/wait.h>.#i
0190: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 75 6e 2e 68  nclude <sys/un.h
01a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
01b0: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
01c0: 73 69 67 6e 61 6c 2e 68 3e 0a 23 69 6e 63 6c 75  signal.h>.#inclu
01d0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
01e0: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
01f0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0200: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65  l.h>.#include <e
0210: 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  rrno.h>.#include
0220: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0230: 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 23 69 6e 63  de <tcl.h>..#inc
0240: 6c 75 64 65 20 3c 6c 69 6e 75 78 2f 73 6f 63 6b  lude <linux/sock
0250: 69 6f 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ios.h>.#include 
0260: 3c 6c 69 6e 75 78 2f 72 6f 75 74 65 2e 68 3e 0a  <linux/route.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 6c 69 6e 75 78 2f  #include <linux/
0280: 69 66 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  if.h>.#include <
0290: 6c 69 6e 75 78 2f 69 66 5f 61 72 70 2e 68 3e 0a  linux/if_arp.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 6c 69 6e 75 78 2f  #include <linux/
02b0: 69 66 5f 62 72 69 64 67 65 2e 68 3e 0a 23 69 6e  if_bridge.h>.#in
02c0: 63 6c 75 64 65 20 3c 6c 69 6e 75 78 2f 6c 6f 6f  clude <linux/loo
02d0: 70 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c  p.h>.#include <l
02e0: 69 6e 75 78 2f 66 73 2e 68 3e 0a 0a 23 69 66 6e  inux/fs.h>..#ifn
02f0: 64 65 66 20 48 4f 53 54 5f 4e 41 4d 45 5f 4d 41  def HOST_NAME_MA
0300: 58 0a 2f 2a 20 53 55 53 76 32 20 4c 69 6d 69 74  X./* SUSv2 Limit
0310: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 48 4f 53 54   */.#define HOST
0320: 5f 4e 41 4d 45 5f 4d 41 58 20 32 35 35 0a 23 65  _NAME_MAX 255.#e
0330: 6e 64 69 66 0a 0a 2f 2a 20 46 72 6f 6d 20 4c 69  ndif../* From Li
0340: 6e 75 78 20 32 2e 36 20 2a 2f 0a 23 69 66 6e 64  nux 2.6 */.#ifnd
0350: 65 66 20 4d 4e 54 5f 44 45 54 41 43 48 0a 23 64  ef MNT_DETACH.#d
0360: 65 66 69 6e 65 20 4d 4e 54 5f 44 45 54 41 43 48  efine MNT_DETACH
0370: 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   2.#endif.#ifnde
0380: 66 20 4d 4e 54 5f 45 58 50 49 52 45 0a 23 64 65  f MNT_EXPIRE.#de
0390: 66 69 6e 65 20 4d 4e 54 5f 45 58 50 49 52 45 20  fine MNT_EXPIRE 
03a0: 34 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  4.#endif.#ifndef
03b0: 20 4d 53 5f 4d 4f 56 45 0a 23 64 65 66 69 6e 65   MS_MOVE.#define
03c0: 20 4d 53 5f 4d 4f 56 45 20 38 31 39 32 0a 23 65   MS_MOVE 8192.#e
03d0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 59 53  ndif.#ifndef SYS
03e0: 4c 4f 47 5f 41 43 54 49 4f 4e 5f 43 4c 4f 53 45  LOG_ACTION_CLOSE
03f0: 0a 23 64 65 66 69 6e 65 20 53 59 53 4c 4f 47 5f  .#define SYSLOG_
0400: 41 43 54 49 4f 4e 5f 43 4c 4f 53 45 20 30 0a 23  ACTION_CLOSE 0.#
0410: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 59  endif.#ifndef SY
0420: 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f 4f 50 45 4e  SLOG_ACTION_OPEN
0430: 0a 23 64 65 66 69 6e 65 20 53 59 53 4c 4f 47 5f  .#define SYSLOG_
0440: 41 43 54 49 4f 4e 5f 4f 50 45 4e 20 31 0a 23 65  ACTION_OPEN 1.#e
0450: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 59 53  ndif.#ifndef SYS
0460: 4c 4f 47 5f 41 43 54 49 4f 4e 5f 52 45 41 44 5f  LOG_ACTION_READ_
0470: 41 4c 4c 0a 23 64 65 66 69 6e 65 20 53 59 53 4c  ALL.#define SYSL
0480: 4f 47 5f 41 43 54 49 4f 4e 5f 52 45 41 44 5f 41  OG_ACTION_READ_A
0490: 4c 4c 20 33 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LL 3.#endif.#ifn
04a0: 64 65 66 20 53 59 53 4c 4f 47 5f 41 43 54 49 4f  def SYSLOG_ACTIO
04b0: 4e 5f 43 4c 45 41 52 0a 23 64 65 66 69 6e 65 20  N_CLEAR.#define 
04c0: 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f 43 4c  SYSLOG_ACTION_CL
04d0: 45 41 52 20 35 0a 23 65 6e 64 69 66 0a 23 69 66  EAR 5.#endif.#if
04e0: 6e 64 65 66 20 53 59 53 4c 4f 47 5f 41 43 54 49  ndef SYSLOG_ACTI
04f0: 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f 4f 46 46 0a 23  ON_CONSOLE_OFF.#
0500: 64 65 66 69 6e 65 20 53 59 53 4c 4f 47 5f 41 43  define SYSLOG_AC
0510: 54 49 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f 4f 46 46  TION_CONSOLE_OFF
0520: 20 36 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   6.#endif.#ifnde
0530: 66 20 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f  f SYSLOG_ACTION_
0540: 43 4f 4e 53 4f 4c 45 5f 4f 4e 0a 23 64 65 66 69  CONSOLE_ON.#defi
0550: 6e 65 20 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e  ne SYSLOG_ACTION
0560: 5f 43 4f 4e 53 4f 4c 45 5f 4f 4e 20 37 0a 23 65  _CONSOLE_ON 7.#e
0570: 6e 64 69 66 0a 0a 2f 2a 20 53 69 6d 70 6c 65 20  ndif../* Simple 
0580: 6d 61 63 72 6f 73 20 2a 2f 0a 23 69 66 6e 64 65  macros */.#ifnde
0590: 66 20 4d 41 58 0a 23 64 65 66 69 6e 65 20 4d 41  f MAX.#define MA
05a0: 58 28 61 2c 20 62 29 20 28 28 28 61 29 20 3c 20  X(a, b) (((a) < 
05b0: 28 62 29 29 20 3f 20 28 62 29 20 3a 20 28 61 29  (b)) ? (b) : (a)
05c0: 29 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ).#endif.#ifndef
05d0: 20 4d 49 4e 0a 23 64 65 66 69 6e 65 20 4d 49 4e   MIN.#define MIN
05e0: 28 61 2c 20 62 29 20 28 28 28 61 29 20 3c 20 28  (a, b) (((a) < (
05f0: 62 29 29 20 3f 20 28 61 29 20 3a 20 28 62 29 29  b)) ? (a) : (b))
0600: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 55 73 65 72  .#endif../* User
0610: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 20 66 6f   environment, fo
0620: 72 20 65 78 65 63 76 65 20 2a 2f 0a 65 78 74 65  r execve */.exte
0630: 72 6e 20 63 68 61 72 20 2a 2a 65 6e 76 69 72 6f  rn char **enviro
0640: 6e 3b 0a 0a 2f 2a 20 52 65 2d 69 6d 70 6c 65 6d  n;../* Re-implem
0650: 65 6e 74 20 74 68 65 73 65 20 69 66 20 6e 65 65  ent these if nee
0660: 64 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 59  ded */.#ifdef SY
0670: 53 5f 69 6e 69 74 5f 6d 6f 64 75 6c 65 0a 73 74  S_init_module.st
0680: 61 74 69 63 20 69 6e 74 20 69 6e 69 74 5f 6d 6f  atic int init_mo
0690: 64 75 6c 65 28 76 6f 69 64 20 2a 76 61 6c 2c 20  dule(void *val, 
06a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 65  unsigned long le
06b0: 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  n, const char *a
06c0: 72 67 73 29 20 7b 0a 09 72 65 74 75 72 6e 28 73  rgs) {..return(s
06d0: 79 73 63 61 6c 6c 28 53 59 53 5f 69 6e 69 74 5f  yscall(SYS_init_
06e0: 6d 6f 64 75 6c 65 2c 20 76 61 6c 2c 20 6c 65 6e  module, val, len
06f0: 2c 20 61 72 67 73 29 29 3b 0a 7d 0a 23 65 6e 64  , args));.}.#end
0700: 69 66 0a 23 69 66 64 65 66 20 53 59 53 5f 64 65  if.#ifdef SYS_de
0710: 6c 65 74 65 5f 6d 6f 64 75 6c 65 0a 73 74 61 74  lete_module.stat
0720: 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 6d 6f  ic int delete_mo
0730: 64 75 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  dule(const char 
0740: 2a 6e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73  *name, int flags
0750: 29 20 7b 0a 09 72 65 74 75 72 6e 28 73 79 73 63  ) {..return(sysc
0760: 61 6c 6c 28 53 59 53 5f 64 65 6c 65 74 65 5f 6d  all(SYS_delete_m
0770: 6f 64 75 6c 65 2c 20 6e 61 6d 65 2c 20 66 6c 61  odule, name, fla
0780: 67 73 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23  gs));.}.#endif.#
0790: 69 66 64 65 66 20 53 59 53 5f 70 69 76 6f 74 5f  ifdef SYS_pivot_
07a0: 72 6f 6f 74 0a 73 74 61 74 69 63 20 69 6e 74 20  root.static int 
07b0: 70 69 76 6f 74 5f 72 6f 6f 74 28 63 6f 6e 73 74  pivot_root(const
07c0: 20 63 68 61 72 20 2a 6e 65 77 5f 72 6f 6f 74 2c   char *new_root,
07d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 75 74   const char *put
07e0: 5f 6f 6c 64 29 20 7b 0a 09 72 65 74 75 72 6e 28  _old) {..return(
07f0: 73 79 73 63 61 6c 6c 28 53 59 53 5f 70 69 76 6f  syscall(SYS_pivo
0800: 74 5f 72 6f 6f 74 2c 20 6e 65 77 5f 72 6f 6f 74  t_root, new_root
0810: 2c 20 70 75 74 5f 6f 6c 64 29 29 3b 0a 7d 0a 23  , put_old));.}.#
0820: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 53 69 6d  endif../*. * Sim
0830: 70 6c 65 20 68 61 73 68 20 72 6f 75 74 69 6e 65  ple hash routine
0840: 20 74 6f 20 65 6e 61 62 6c 65 20 73 77 69 74 63   to enable switc
0850: 68 69 6e 67 20 6f 6e 20 61 20 73 74 72 69 6e 67  hing on a string
0860: 20 74 6f 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74   to be implement
0870: 65 64 0a 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ed. */.static un
0880: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 75 61 70  signed long tuap
0890: 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c  i_internal_simpl
08a0: 65 68 61 73 68 28 63 6f 6e 73 74 20 76 6f 69 64  ehash(const void
08b0: 20 2a 64 61 74 61 62 75 66 2c 20 69 6e 74 20 64   *databuf, int d
08c0: 61 74 61 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  atalen) {..unsig
08d0: 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20  ned long retval 
08e0: 3d 20 30 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  = 0;..const unsi
08f0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
0900: 0a 0a 09 64 61 74 61 20 3d 20 64 61 74 61 62 75  ...data = databu
0910: 66 3b 0a 0a 09 66 6f 72 20 28 3b 20 64 61 74 61  f;...for (; data
0920: 6c 65 6e 20 3e 20 30 3b 20 64 61 74 61 6c 65 6e  len > 0; datalen
0930: 2d 2d 2c 64 61 74 61 2b 2b 29 20 7b 0a 09 09 72  --,data++) {...r
0940: 65 74 76 61 6c 20 5e 3d 20 28 72 65 74 76 61 6c  etval ^= (retval
0950: 20 3e 3e 20 32 35 29 20 26 20 30 78 37 46 3b 0a   >> 25) & 0x7F;.
0960: 09 09 72 65 74 76 61 6c 20 3c 3c 3d 20 37 3b 0a  ..retval <<= 7;.
0970: 09 09 72 65 74 76 61 6c 20 26 3d 20 28 30 78 46  ..retval &= (0xF
0980: 46 46 46 46 46 46 46 55 4c 29 3b 0a 09 09 72 65  FFFFFFFUL);...re
0990: 74 76 61 6c 20 5e 3d 20 2a 64 61 74 61 3b 0a 09  tval ^= *data;..
09a0: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
09b0: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e  l);.}..static un
09c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 75 61 70  signed long tuap
09d0: 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c  i_internal_simpl
09e0: 65 68 61 73 68 5f 6f 62 6a 28 54 63 6c 5f 4f 62  ehash_obj(Tcl_Ob
09f0: 6a 20 2a 74 63 6c 5f 64 61 74 61 29 20 7b 0a 09  j *tcl_data) {..
0a00: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65  unsigned long re
0a10: 74 76 61 6c 3b 0a 09 63 68 61 72 20 2a 64 61 74  tval;..char *dat
0a20: 61 3b 0a 09 69 6e 74 20 64 61 74 61 6c 65 6e 20  a;..int datalen 
0a30: 3d 20 2d 31 3b 0a 0a 09 64 61 74 61 20 3d 20 54  = -1;...data = T
0a40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
0a50: 4f 62 6a 28 74 63 6c 5f 64 61 74 61 2c 20 26 64  Obj(tcl_data, &d
0a60: 61 74 61 6c 65 6e 29 3b 0a 0a 09 72 65 74 76 61  atalen);...retva
0a70: 6c 20 3d 20 74 75 61 70 69 5f 69 6e 74 65 72 6e  l = tuapi_intern
0a80: 61 6c 5f 73 69 6d 70 6c 65 68 61 73 68 28 64 61  al_simplehash(da
0a90: 74 61 2c 20 64 61 74 61 6c 65 6e 29 3b 0a 0a 09  ta, datalen);...
0aa0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
0ab0: 7d 0a 0a 23 69 66 20 30 0a 2f 2a 20 4e 4f 54 55  }..#if 0./* NOTU
0ac0: 53 45 44 3a 20 55 6e 63 6f 6d 6d 65 6e 74 20 77  SED: Uncomment w
0ad0: 68 65 6e 20 6e 65 65 64 65 64 3a 20 2a 2f 0a 73  hen needed: */.s
0ae0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
0af0: 6f 6e 67 20 74 75 61 70 69 5f 69 6e 74 65 72 6e  ong tuapi_intern
0b00: 61 6c 5f 73 69 6d 70 6c 65 68 61 73 68 5f 73 74  al_simplehash_st
0b10: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61  r(const char *da
0b20: 74 61 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ta) {..unsigned 
0b30: 6c 6f 6e 67 20 72 65 74 76 61 6c 3b 0a 09 69 6e  long retval;..in
0b40: 74 20 64 61 74 61 6c 65 6e 3b 0a 0a 09 64 61 74  t datalen;...dat
0b50: 61 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 64 61  alen = strlen(da
0b60: 74 61 29 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ta);...retval = 
0b70: 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73  tuapi_internal_s
0b80: 69 6d 70 6c 65 68 61 73 68 28 64 61 74 61 2c 20  implehash(data, 
0b90: 64 61 74 61 6c 65 6e 29 3b 0a 0a 09 72 65 74 75  datalen);...retu
0ba0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 23 65  rn(retval);.}.#e
0bb0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74  ndif..static int
0bc0: 20 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 70   tuapi_internalp
0bd0: 72 6f 63 5f 73 69 6d 70 6c 65 68 61 73 68 28 43  roc_simplehash(C
0be0: 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63  lientData cd, Tc
0bf0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0c00: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
0c10: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
0c20: 5d 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ]) {..unsigned l
0c30: 6f 6e 67 20 68 61 73 68 76 61 6c 3b 0a 09 54 63  ong hashval;..Tc
0c40: 6c 5f 4f 62 6a 20 2a 68 61 73 68 76 61 6c 5f 6f  l_Obj *hashval_o
0c50: 62 6a 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 21  bj;...if (objc !
0c60: 3d 20 32 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  = 2) {...Tcl_Set
0c70: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0c80: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
0c90: 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73  bj("wrong # args
0ca0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a  : should be \"::
0cb0: 74 75 61 70 69 3a 3a 69 6e 74 65 72 6e 61 6c 3a  tuapi::internal:
0cc0: 3a 68 61 73 68 20 76 61 6c 75 65 5c 22 22 2c 20  :hash value\"", 
0cd0: 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  -1));....return(
0ce0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  TCL_ERROR);..}..
0cf0: 09 68 61 73 68 76 61 6c 20 3d 20 74 75 61 70 69  .hashval = tuapi
0d00: 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65  _internal_simple
0d10: 68 61 73 68 5f 6f 62 6a 28 6f 62 6a 76 5b 31 5d  hash_obj(objv[1]
0d20: 29 3b 0a 0a 09 68 61 73 68 76 61 6c 5f 6f 62 6a  );...hashval_obj
0d30: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
0d40: 0a 09 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74  ..Tcl_SetWideInt
0d50: 4f 62 6a 28 68 61 73 68 76 61 6c 5f 6f 62 6a 2c  Obj(hashval_obj,
0d60: 20 68 61 73 68 76 61 6c 29 3b 0a 0a 09 54 63 6c   hashval);...Tcl
0d70: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
0d80: 74 65 72 70 2c 20 68 61 73 68 76 61 6c 5f 6f 62  terp, hashval_ob
0d90: 6a 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  j);...return(TCL
0da0: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
0db0: 69 6e 74 20 74 75 61 70 69 5f 69 6e 74 65 72 6e  int tuapi_intern
0dc0: 61 6c 5f 67 65 74 73 6f 63 6b 28 69 6e 74 20 2a  al_getsock(int *
0dd0: 73 6f 63 6b 5f 76 34 5f 6f 75 74 2c 20 69 6e 74  sock_v4_out, int
0de0: 20 2a 73 6f 63 6b 5f 76 36 5f 6f 75 74 29 20 7b   *sock_v6_out) {
0df0: 0a 09 69 6e 74 20 73 6f 63 6b 5f 76 34 20 3d 20  ..int sock_v4 = 
0e00: 2d 31 2c 20 73 6f 63 6b 5f 76 36 20 3d 20 2d 31  -1, sock_v6 = -1
0e10: 3b 0a 09 69 6e 74 20 73 6f 63 6b 3b 0a 0a 09 69  ;..int sock;...i
0e20: 66 20 28 73 6f 63 6b 5f 76 34 5f 6f 75 74 20 3d  f (sock_v4_out =
0e30: 3d 20 4e 55 4c 4c 20 26 26 20 73 6f 63 6b 5f 76  = NULL && sock_v
0e40: 36 5f 6f 75 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  6_out == NULL) {
0e50: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
0e60: 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 34 5f  }...if (sock_v4_
0e70: 6f 75 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  out != NULL) {..
0e80: 09 2f 2a 0a 09 09 20 2a 20 43 68 65 63 6b 20 66  ./*... * Check f
0e90: 6f 72 20 49 50 76 34 20 73 75 70 70 6f 72 74 20  or IPv4 support 
0ea0: 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f  before trying to
0eb0: 20 63 72 65 61 74 65 20 61 6e 20 49 50 76 34 20   create an IPv4 
0ec0: 73 6f 63 6b 65 74 20 74 6f 0a 09 09 20 2a 20 61  socket to... * a
0ed0: 76 6f 69 64 20 64 65 6d 61 6e 64 2d 6c 6f 61 64  void demand-load
0ee0: 69 6e 67 20 49 50 76 34 20 28 58 58 58 3a 20 54  ing IPv4 (XXX: T
0ef0: 4f 44 4f 29 0a 09 09 20 2a 2f 0a 09 09 73 6f 63  ODO)... */...soc
0f00: 6b 5f 76 34 20 3d 20 73 6f 63 6b 65 74 28 41 46  k_v4 = socket(AF
0f10: 5f 49 4e 45 54 2c 20 53 4f 43 4b 5f 44 47 52 41  _INET, SOCK_DGRA
0f20: 4d 2c 20 30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  M, 0);..}...if (
0f30: 73 6f 63 6b 5f 76 36 5f 6f 75 74 20 21 3d 20 4e  sock_v6_out != N
0f40: 55 4c 4c 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a  ULL) {.../*... *
0f50: 20 43 68 65 63 6b 20 66 6f 72 20 49 50 76 36 20   Check for IPv6 
0f60: 73 75 70 70 6f 72 74 20 62 65 66 6f 72 65 20 74  support before t
0f70: 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20  rying to create 
0f80: 61 6e 20 49 50 76 36 20 73 6f 63 6b 65 74 20 74  an IPv6 socket t
0f90: 6f 0a 09 09 20 2a 20 61 76 6f 69 64 20 64 65 6d  o... * avoid dem
0fa0: 61 6e 64 2d 6c 6f 61 64 69 6e 67 20 49 50 76 36  and-loading IPv6
0fb0: 20 28 58 58 58 3a 20 54 4f 44 4f 29 0a 09 09 20   (XXX: TODO)... 
0fc0: 2a 2f 0a 09 09 73 6f 63 6b 5f 76 36 20 3d 20 73  */...sock_v6 = s
0fd0: 6f 63 6b 65 74 28 41 46 5f 49 4e 45 54 36 2c 20  ocket(AF_INET6, 
0fe0: 53 4f 43 4b 5f 44 47 52 41 4d 2c 20 30 29 3b 0a  SOCK_DGRAM, 0);.
0ff0: 09 7d 0a 0a 09 2f 2a 20 50 69 63 6b 20 61 20 73  .}.../* Pick a s
1000: 6f 63 6b 65 74 20 74 6f 20 71 75 65 72 79 20 66  ocket to query f
1010: 6f 72 20 74 68 65 20 69 6e 74 65 72 66 61 63 65  or the interface
1020: 20 6c 69 73 74 20 2a 2f 0a 09 69 66 20 28 73 6f   list */..if (so
1030: 63 6b 5f 76 34 20 3d 3d 20 2d 31 20 26 26 20 73  ck_v4 == -1 && s
1040: 6f 63 6b 5f 76 36 20 3d 3d 20 2d 31 29 20 7b 0a  ock_v6 == -1) {.
1050: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
1060: 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 36 20 21  ...if (sock_v6 !
1070: 3d 20 2d 31 29 20 7b 0a 09 09 73 6f 63 6b 20 3d  = -1) {...sock =
1080: 20 73 6f 63 6b 5f 76 36 3b 0a 09 7d 20 65 6c 73   sock_v6;..} els
1090: 65 20 7b 0a 09 09 73 6f 63 6b 20 3d 20 73 6f 63  e {...sock = soc
10a0: 6b 5f 76 34 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  k_v4;..}...if (s
10b0: 6f 63 6b 5f 76 34 5f 6f 75 74 20 21 3d 20 4e 55  ock_v4_out != NU
10c0: 4c 4c 29 20 7b 0a 09 09 2a 73 6f 63 6b 5f 76 34  LL) {...*sock_v4
10d0: 5f 6f 75 74 20 3d 20 73 6f 63 6b 5f 76 34 3b 0a  _out = sock_v4;.
10e0: 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 36  .}...if (sock_v6
10f0: 5f 6f 75 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  _out != NULL) {.
1100: 09 09 2a 73 6f 63 6b 5f 76 36 5f 6f 75 74 20 3d  ..*sock_v6_out =
1110: 20 73 6f 63 6b 5f 76 36 3b 0a 09 7d 0a 0a 09 72   sock_v6;..}...r
1120: 65 74 75 72 6e 28 73 6f 63 6b 29 3b 0a 7d 0a 0a  eturn(sock);.}..
1130: 2f 2a 0a 20 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20  /*. * Low-level 
1140: 53 79 73 74 65 6d 20 43 61 6c 6c 20 57 72 61 70  System Call Wrap
1150: 70 65 72 20 50 72 6f 63 65 64 75 72 65 73 0a 20  per Procedures. 
1160: 2a 0a 20 2a 20 54 68 65 73 65 20 70 72 6f 63 65  *. * These proce
1170: 64 75 72 65 73 20 73 68 6f 75 6c 64 20 6d 69 6e  dures should min
1180: 69 6d 61 6c 6c 79 20 77 72 61 70 20 4c 69 6e 75  imally wrap Linu
1190: 78 20 6f 72 20 55 4e 49 58 20 73 79 73 74 65 6d  x or UNIX system
11a0: 20 63 61 6c 6c 73 20 74 6f 0a 20 2a 20 65 78 70   calls to. * exp
11b0: 6f 73 65 20 74 6f 20 74 68 65 20 54 63 6c 2d 6c  ose to the Tcl-l
11c0: 65 76 65 6c 2e 20 20 57 68 65 72 65 20 70 6f 73  evel.  Where pos
11d0: 73 69 62 6c 65 20 61 63 63 65 70 74 20 73 79 6d  sible accept sym
11e0: 62 6f 6c 69 63 20 6e 61 6d 65 73 20 72 61 74 68  bolic names rath
11f0: 65 72 0a 20 2a 20 74 68 61 6e 20 6e 75 6d 65 72  er. * than numer
1200: 69 63 20 76 61 6c 75 65 73 20 28 2e 65 2e 67 2c  ic values (.e.g,
1210: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   list of values 
1220: 74 6f 20 4f 52 20 74 6f 67 65 74 68 65 72 20 74  to OR together t
1230: 6f 20 67 65 74 20 66 6c 61 67 73 29 2e 0a 20 2a  o get flags).. *
1240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61  /.static int tua
1250: 70 69 5f 6d 6f 75 6e 74 28 43 6c 69 65 6e 74 44  pi_mount(ClientD
1260: 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65  ata cd, Tcl_Inte
1270: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1280: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43  objc, Tcl_Obj *C
1290: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09  ONST objv[]) {..
12a0: 54 63 6c 5f 4f 62 6a 20 2a 6d 6f 75 6e 74 66 6c  Tcl_Obj *mountfl
12b0: 61 67 73 5f 6f 62 6a 2c 20 2a 2a 6d 6f 75 6e 74  ags_obj, **mount
12c0: 66 6c 61 67 73 5f 6c 69 73 74 2c 20 2a 6d 6f 75  flags_list, *mou
12d0: 6e 74 66 6c 61 67 3b 0a 09 69 6e 74 20 6d 6f 75  ntflag;..int mou
12e0: 6e 74 66 6c 61 67 73 5f 6c 69 73 74 5f 6c 65 6e  ntflags_list_len
12f0: 3b 0a 09 63 68 61 72 20 2a 73 6f 75 72 63 65 2c  ;..char *source,
1300: 20 2a 74 61 72 67 65 74 2c 20 2a 66 73 74 79 70   *target, *fstyp
1310: 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
1320: 67 20 6d 6f 75 6e 74 66 6c 61 67 73 20 3d 20 30  g mountflags = 0
1330: 3b 0a 09 76 6f 69 64 20 2a 64 61 74 61 20 3d 20  ;..void *data = 
1340: 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6d 6f 75 6e 74  NULL;..int mount
1350: 5f 72 65 74 2c 20 74 63 6c 5f 72 65 74 3b 0a 0a  _ret, tcl_ret;..
1360: 09 69 66 20 28 6f 62 6a 63 20 3c 20 35 20 7c 7c  .if (objc < 5 ||
1370: 20 6f 62 6a 63 20 3e 20 36 29 20 7b 0a 09 09 54   objc > 6) {...T
1380: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1390: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
13a0: 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20  tringObj("wrong 
13b0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
13c0: 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  e \"::tuapi::sys
13d0: 63 61 6c 6c 3a 3a 6d 6f 75 6e 74 20 73 6f 75 72  call::mount sour
13e0: 63 65 20 74 61 72 67 65 74 20 66 73 74 79 70 65  ce target fstype
13f0: 20 6d 6f 75 6e 74 66 6c 61 67 73 20 3f 64 61 74   mountflags ?dat
1400: 61 3f 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09  a?\"", -1));....
1410: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
1420: 29 3b 0a 09 7d 0a 0a 09 73 6f 75 72 63 65 20 3d  );..}...source =
1430: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1440: 62 6a 76 5b 31 5d 29 3b 0a 09 74 61 72 67 65 74  bjv[1]);..target
1450: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1460: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 09 66 73 74 79  (objv[2]);..fsty
1470: 70 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pe = Tcl_GetStri
1480: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 6d 6f  ng(objv[3]);..mo
1490: 75 6e 74 66 6c 61 67 73 5f 6f 62 6a 20 3d 20 6f  untflags_obj = o
14a0: 62 6a 76 5b 34 5d 3b 0a 0a 09 69 66 20 28 6f 62  bjv[4];...if (ob
14b0: 6a 63 20 3d 3d 20 36 29 20 7b 0a 09 09 64 61 74  jc == 6) {...dat
14c0: 61 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  a = Tcl_GetStrin
14d0: 67 28 6f 62 6a 76 5b 35 5d 29 3b 0a 09 7d 0a 0a  g(objv[5]);..}..
14e0: 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 4c  .tcl_ret = Tcl_L
14f0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
1500: 73 28 69 6e 74 65 72 70 2c 20 6d 6f 75 6e 74 66  s(interp, mountf
1510: 6c 61 67 73 5f 6f 62 6a 2c 20 26 6d 6f 75 6e 74  lags_obj, &mount
1520: 66 6c 61 67 73 5f 6c 69 73 74 5f 6c 65 6e 2c 20  flags_list_len, 
1530: 26 6d 6f 75 6e 74 66 6c 61 67 73 5f 6c 69 73 74  &mountflags_list
1540: 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20  );..if (tcl_ret 
1550: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72  != TCL_OK) {...r
1560: 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a  eturn(tcl_ret);.
1570: 09 7d 0a 0a 09 66 6f 72 20 28 3b 20 6d 6f 75 6e  .}...for (; moun
1580: 74 66 6c 61 67 73 5f 6c 69 73 74 5f 6c 65 6e 20  tflags_list_len 
1590: 3e 20 30 3b 20 6d 6f 75 6e 74 66 6c 61 67 73 5f  > 0; mountflags_
15a0: 6c 69 73 74 5f 6c 65 6e 2d 2d 2c 6d 6f 75 6e 74  list_len--,mount
15b0: 66 6c 61 67 73 5f 6c 69 73 74 2b 2b 29 20 7b 0a  flags_list++) {.
15c0: 09 09 6d 6f 75 6e 74 66 6c 61 67 20 3d 20 6d 6f  ..mountflag = mo
15d0: 75 6e 74 66 6c 61 67 73 5f 6c 69 73 74 5b 30 5d  untflags_list[0]
15e0: 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 74 75 61  ;....switch (tua
15f0: 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70  pi_internal_simp
1600: 6c 65 68 61 73 68 5f 6f 62 6a 28 6d 6f 75 6e 74  lehash_obj(mount
1610: 66 6c 61 67 29 29 20 7b 0a 23 69 66 64 65 66 20  flag)) {.#ifdef 
1620: 4d 53 5f 42 49 4e 44 0a 09 09 09 63 61 73 65 20  MS_BIND....case 
1630: 30 78 38 35 32 36 37 34 34 3a 20 2f 2a 20 42 49  0x8526744: /* BI
1640: 4e 44 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74 66  ND */.....mountf
1650: 6c 61 67 73 20 7c 3d 20 4d 53 5f 42 49 4e 44 3b  lags |= MS_BIND;
1660: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64  .....break;.#end
1670: 69 66 0a 23 69 66 64 65 66 20 4d 53 5f 44 49 52  if.#ifdef MS_DIR
1680: 53 59 4e 43 0a 09 09 09 63 61 73 65 20 30 78 32  SYNC....case 0x2
1690: 61 66 66 34 31 63 33 3a 20 2f 2a 20 44 49 52 53  aff41c3: /* DIRS
16a0: 59 4e 43 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74  YNC */.....mount
16b0: 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 44 49 52 53  flags |= MS_DIRS
16c0: 59 4e 43 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  YNC;.....break;.
16d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53  #endif.#ifdef MS
16e0: 5f 4d 41 4e 44 4c 4f 43 4b 0a 09 09 09 63 61 73  _MANDLOCK....cas
16f0: 65 20 30 78 34 31 30 64 62 63 62 3a 20 2f 2a 20  e 0x410dbcb: /* 
1700: 4d 41 4e 44 4c 4f 43 4b 20 2a 2f 0a 09 09 09 09  MANDLOCK */.....
1710: 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53  mountflags |= MS
1720: 5f 4d 41 4e 44 4c 4f 43 4b 3b 0a 09 09 09 09 62  _MANDLOCK;.....b
1730: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
1740: 64 65 66 20 4d 53 5f 4d 4f 56 45 0a 09 09 09 63  def MS_MOVE....c
1750: 61 73 65 20 30 78 39 62 33 65 62 34 35 3a 20 2f  ase 0x9b3eb45: /
1760: 2a 20 4d 4f 56 45 20 2a 2f 0a 09 09 09 09 6d 6f  * MOVE */.....mo
1770: 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 4d  untflags |= MS_M
1780: 4f 56 45 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  OVE;.....break;.
1790: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53  #endif.#ifdef MS
17a0: 5f 4e 4f 41 54 49 4d 45 0a 09 09 09 63 61 73 65  _NOATIME....case
17b0: 20 30 78 31 61 30 66 35 38 63 35 3a 20 2f 2a 20   0x1a0f58c5: /* 
17c0: 4e 4f 41 54 49 4d 45 20 2a 2f 0a 09 09 09 09 6d  NOATIME */.....m
17d0: 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f  ountflags |= MS_
17e0: 4e 4f 41 54 49 4d 45 3b 0a 09 09 09 09 62 72 65  NOATIME;.....bre
17f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ak;.#endif.#ifde
1800: 66 20 4d 53 5f 4e 4f 44 45 56 0a 09 09 09 63 61  f MS_NODEV....ca
1810: 73 65 20 30 78 65 39 66 31 32 30 64 36 3a 20 2f  se 0xe9f120d6: /
1820: 2a 20 4e 4f 44 45 56 20 2a 2f 0a 09 09 09 09 6d  * NODEV */.....m
1830: 6f 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f  ountflags |= MS_
1840: 4e 4f 44 45 56 3b 0a 09 09 09 09 62 72 65 61 6b  NODEV;.....break
1850: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1860: 4d 53 5f 4e 4f 44 49 52 41 54 49 4d 45 0a 09 09  MS_NODIRATIME...
1870: 09 63 61 73 65 20 30 78 64 65 30 38 66 66 34 35  .case 0xde08ff45
1880: 3a 20 2f 2a 20 4e 4f 44 49 52 41 54 49 4d 45 20  : /* NODIRATIME 
1890: 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74 66 6c 61 67  */.....mountflag
18a0: 73 20 7c 3d 20 4d 53 5f 4e 4f 44 49 52 41 54 49  s |= MS_NODIRATI
18b0: 4d 45 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23  ME;.....break;.#
18c0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53 5f  endif.#ifdef MS_
18d0: 4e 4f 45 58 45 43 0a 09 09 09 63 61 73 65 20 30  NOEXEC....case 0
18e0: 78 66 38 62 37 31 38 63 33 3a 20 2f 2a 20 4e 4f  xf8b718c3: /* NO
18f0: 45 58 45 43 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e  EXEC */.....moun
1900: 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 4e 4f 45  tflags |= MS_NOE
1910: 58 45 43 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  XEC;.....break;.
1920: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53  #endif.#ifdef MS
1930: 5f 4e 4f 53 55 49 44 0a 09 09 09 63 61 73 65 20  _NOSUID....case 
1940: 30 78 66 61 37 34 35 65 63 34 3a 20 2f 2a 20 4e  0xfa745ec4: /* N
1950: 4f 53 55 49 44 20 2a 2f 0a 09 09 09 09 6d 6f 75  OSUID */.....mou
1960: 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 4e 4f  ntflags |= MS_NO
1970: 53 55 49 44 3b 0a 09 09 09 09 62 72 65 61 6b 3b  SUID;.....break;
1980: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4d  .#endif.#ifdef M
1990: 53 5f 52 44 4f 4e 4c 59 0a 09 09 09 63 61 73 65  S_RDONLY....case
19a0: 20 30 78 34 39 66 32 65 63 35 39 3a 20 2f 2a 20   0x49f2ec59: /* 
19b0: 52 44 4f 4e 4c 59 20 2a 2f 0a 09 09 09 09 6d 6f  RDONLY */.....mo
19c0: 75 6e 74 66 6c 61 67 73 20 7c 3d 20 4d 53 5f 52  untflags |= MS_R
19d0: 44 4f 4e 4c 59 3b 0a 09 09 09 09 62 72 65 61 6b  DONLY;.....break
19e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
19f0: 4d 53 5f 52 45 4c 41 54 49 4d 45 0a 09 09 09 63  MS_RELATIME....c
1a00: 61 73 65 20 30 78 34 38 31 39 35 34 63 35 3a 20  ase 0x481954c5: 
1a10: 2f 2a 20 52 45 4c 41 54 49 4d 45 20 2a 2f 0a 09  /* RELATIME */..
1a20: 09 09 09 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d  ...mountflags |=
1a30: 20 4d 53 5f 52 45 4c 41 54 49 4d 45 3b 0a 09 09   MS_RELATIME;...
1a40: 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1a50: 23 69 66 64 65 66 20 4d 53 5f 52 45 4d 4f 55 4e  #ifdef MS_REMOUN
1a60: 54 0a 09 09 09 63 61 73 65 20 30 78 64 39 35 30  T....case 0xd950
1a70: 37 31 35 34 3a 20 2f 2a 20 52 45 4d 4f 55 4e 54  7154: /* REMOUNT
1a80: 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74 66 6c 61   */.....mountfla
1a90: 67 73 20 7c 3d 20 4d 53 5f 52 45 4d 4f 55 4e 54  gs |= MS_REMOUNT
1aa0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e  ;.....break;.#en
1ab0: 64 69 66 0a 23 69 66 64 65 66 20 4d 53 5f 53 49  dif.#ifdef MS_SI
1ac0: 4c 45 4e 54 0a 09 09 09 63 61 73 65 20 30 78 39  LENT....case 0x9
1ad0: 39 39 30 32 39 35 34 3a 20 2f 2a 20 53 49 4c 45  9902954: /* SILE
1ae0: 4e 54 20 2a 2f 0a 09 09 09 09 6d 6f 75 6e 74 66  NT */.....mountf
1af0: 6c 61 67 73 20 7c 3d 20 4d 53 5f 53 49 4c 45 4e  lags |= MS_SILEN
1b00: 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 65  T;.....break;.#e
1b10: 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53 5f 53  ndif.#ifdef MS_S
1b20: 54 52 49 43 54 41 54 49 4d 45 0a 09 09 09 63 61  TRICTATIME....ca
1b30: 73 65 20 30 78 35 36 32 66 61 30 34 35 3a 20 2f  se 0x562fa045: /
1b40: 2a 20 53 54 52 49 43 54 41 54 49 4d 45 20 2a 2f  * STRICTATIME */
1b50: 0a 09 09 09 09 6d 6f 75 6e 74 66 6c 61 67 73 20  .....mountflags 
1b60: 7c 3d 20 4d 53 5f 53 54 52 49 43 54 41 54 49 4d  |= MS_STRICTATIM
1b70: 45 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 65  E;.....break;.#e
1b80: 6e 64 69 66 0a 23 69 66 64 65 66 20 4d 53 5f 53  ndif.#ifdef MS_S
1b90: 59 4e 43 48 52 4f 4e 4f 55 53 0a 09 09 09 63 61  YNCHRONOUS....ca
1ba0: 73 65 20 30 78 62 66 37 39 39 33 35 33 3a 20 2f  se 0xbf799353: /
1bb0: 2a 20 53 59 4e 43 48 52 4f 4e 4f 55 53 20 2a 2f  * SYNCHRONOUS */
1bc0: 0a 09 09 09 63 61 73 65 20 30 78 61 37 36 36 37  ....case 0xa7667
1bd0: 34 33 3a 20 2f 2a 20 53 59 4e 43 20 2a 2f 0a 09  43: /* SYNC */..
1be0: 09 09 09 6d 6f 75 6e 74 66 6c 61 67 73 20 7c 3d  ...mountflags |=
1bf0: 20 4d 53 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3b   MS_SYNCHRONOUS;
1c00: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64  .....break;.#end
1c10: 69 66 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  if....default:..
1c20: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
1c30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1c40: 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e 6b 6e 6f  ObjPrintf("unkno
1c50: 77 6e 20 65 6c 65 6d 65 6e 74 20 69 6e 20 6d 6f  wn element in mo
1c60: 75 6e 74 66 6c 61 67 73 3a 20 5c 22 25 73 5c 22  untflags: \"%s\"
1c70: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
1c80: 28 6d 6f 75 6e 74 66 6c 61 67 29 29 29 3b 0a 0a  (mountflag)));..
1c90: 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
1ca0: 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  RROR);...}..}...
1cb0: 6d 6f 75 6e 74 5f 72 65 74 20 3d 20 6d 6f 75 6e  mount_ret = moun
1cc0: 74 28 73 6f 75 72 63 65 2c 20 74 61 72 67 65 74  t(source, target
1cd0: 2c 20 66 73 74 79 70 65 2c 20 6d 6f 75 6e 74 66  , fstype, mountf
1ce0: 6c 61 67 73 2c 20 64 61 74 61 29 3b 0a 09 69 66  lags, data);..if
1cf0: 20 28 6d 6f 75 6e 74 5f 72 65 74 20 21 3d 20 30   (mount_ret != 0
1d00: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ) {...Tcl_SetObj
1d10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1d30: 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c  strerror(errno),
1d40: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
1d50: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
1d60: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
1d70: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1d80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 61 72 67  ewStringObj(targ
1d90: 65 74 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75  et, -1));...retu
1da0: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73  rn(TCL_OK);.}..s
1db0: 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
1dc0: 75 6d 6f 75 6e 74 28 43 6c 69 65 6e 74 44 61 74  umount(ClientDat
1dd0: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  a cd, Tcl_Interp
1de0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
1df0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  jc, Tcl_Obj *CON
1e00: 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63  ST objv[]) {..Tc
1e10: 6c 5f 4f 62 6a 20 2a 2a 66 6c 61 67 73 2c 20 2a  l_Obj **flags, *
1e20: 66 6c 61 67 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  flag;..Tcl_Obj *
1e30: 70 61 74 68 6e 61 6d 65 5f 6f 62 6a 3b 0a 09 63  pathname_obj;..c
1e40: 68 61 72 20 2a 70 61 74 68 6e 61 6d 65 3b 0a 09  har *pathname;..
1e50: 69 6e 74 20 75 6d 6f 75 6e 74 32 5f 66 6c 61 67  int umount2_flag
1e60: 73 20 3d 20 30 3b 0a 09 69 6e 74 20 66 6c 61 67  s = 0;..int flag
1e70: 73 5f 63 6e 74 3b 0a 09 69 6e 74 20 63 68 6b 5f  s_cnt;..int chk_
1e80: 72 65 74 2c 20 74 63 6c 5f 72 65 74 3b 0a 0a 09  ret, tcl_ret;...
1e90: 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20  if (objc < 2 || 
1ea0: 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 09 54 63  objc > 3) {...Tc
1eb0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1ec0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1ed0: 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23  ringObj("wrong #
1ee0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1ef0: 20 5c 22 74 75 61 70 69 3a 3a 73 79 73 63 61 6c   \"tuapi::syscal
1f00: 6c 3a 3a 75 6d 6f 75 6e 74 20 64 69 72 20 3f 66  l::umount dir ?f
1f10: 6c 61 67 73 3f 5c 22 22 2c 20 2d 31 29 29 3b 0a  lags?\"", -1));.
1f20: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
1f30: 52 4f 52 29 3b 0a 09 7d 0a 0a 09 70 61 74 68 6e  ROR);..}...pathn
1f40: 61 6d 65 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31  ame_obj = objv[1
1f50: 5d 3b 0a 09 70 61 74 68 6e 61 6d 65 20 3d 20 54  ];..pathname = T
1f60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 61 74  cl_GetString(pat
1f70: 68 6e 61 6d 65 5f 6f 62 6a 29 3b 0a 0a 09 2f 2a  hname_obj);.../*
1f80: 20 53 65 74 20 61 20 64 65 66 61 75 6c 74 20 72   Set a default r
1f90: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
1fa0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1fb0: 28 69 6e 74 65 72 70 2c 20 70 61 74 68 6e 61 6d  (interp, pathnam
1fc0: 65 5f 6f 62 6a 29 3b 0a 0a 09 69 66 20 28 6f 62  e_obj);...if (ob
1fd0: 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 09 74 63 6c  jc == 3) {...tcl
1fe0: 5f 72 65 74 20 3d 20 54 63 6c 5f 4c 69 73 74 4f  _ret = Tcl_ListO
1ff0: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
2000: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
2010: 66 6c 61 67 73 5f 63 6e 74 2c 20 26 66 6c 61 67  flags_cnt, &flag
2020: 73 29 3b 0a 09 09 69 66 20 28 74 63 6c 5f 72 65  s);...if (tcl_re
2030: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
2040: 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74  ..return(tcl_ret
2050: 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b  );...}....for (;
2060: 20 66 6c 61 67 73 5f 63 6e 74 20 3e 20 30 3b 20   flags_cnt > 0; 
2070: 66 6c 61 67 73 5f 63 6e 74 2d 2d 2c 66 6c 61 67  flags_cnt--,flag
2080: 73 2b 2b 29 20 7b 0a 09 09 09 66 6c 61 67 20 3d  s++) {....flag =
2090: 20 66 6c 61 67 73 5b 30 5d 3b 0a 0a 09 09 09 73   flags[0];.....s
20a0: 77 69 74 63 68 20 28 74 75 61 70 69 5f 69 6e 74  witch (tuapi_int
20b0: 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68 61 73 68  ernal_simplehash
20c0: 5f 6f 62 6a 28 66 6c 61 67 29 29 20 7b 0a 09 09  _obj(flag)) {...
20d0: 09 09 63 61 73 65 20 30 78 36 39 66 34 61 33 63  ..case 0x69f4a3c
20e0: 35 3a 20 2f 2a 20 46 4f 52 43 45 20 2a 2f 0a 09  5: /* FORCE */..
20f0: 09 09 09 09 75 6d 6f 75 6e 74 32 5f 66 6c 61 67  ....umount2_flag
2100: 73 20 7c 3d 20 4d 4e 54 5f 46 4f 52 43 45 3b 0a  s |= MNT_FORCE;.
2110: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
2120: 09 63 61 73 65 20 30 78 35 61 39 31 37 33 63 38  .case 0x5a9173c8
2130: 3a 20 2f 2a 20 44 45 54 41 43 48 20 2a 2f 0a 09  : /* DETACH */..
2140: 09 09 09 09 75 6d 6f 75 6e 74 32 5f 66 6c 61 67  ....umount2_flag
2150: 73 20 7c 3d 20 4d 4e 54 5f 44 45 54 41 43 48 3b  s |= MNT_DETACH;
2160: 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
2170: 09 09 63 61 73 65 20 30 78 38 61 31 33 37 66 63  ..case 0x8a137fc
2180: 35 3a 20 2f 2a 20 45 58 50 49 52 45 20 2a 2f 0a  5: /* EXPIRE */.
2190: 09 09 09 09 09 75 6d 6f 75 6e 74 32 5f 66 6c 61  .....umount2_fla
21a0: 67 73 20 7c 3d 20 4d 4e 54 5f 45 58 50 49 52 45  gs |= MNT_EXPIRE
21b0: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
21c0: 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
21d0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
21e0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
21f0: 6a 50 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e  jPrintf("unknown
2200: 20 66 6c 61 67 20 5c 22 25 73 5c 22 20 73 70 65   flag \"%s\" spe
2210: 63 69 66 69 65 64 22 2c 20 54 63 6c 5f 47 65 74  cified", Tcl_Get
2220: 53 74 72 69 6e 67 28 66 6c 61 67 29 29 29 3b 0a  String(flag)));.
2230: 09 0a 09 09 09 09 09 72 65 74 75 72 6e 28 54 43  .......return(TC
2240: 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09  L_ERROR);....}..
2250: 09 7d 0a 0a 09 09 63 68 6b 5f 72 65 74 20 3d 20  .}....chk_ret = 
2260: 75 6d 6f 75 6e 74 32 28 70 61 74 68 6e 61 6d 65  umount2(pathname
2270: 2c 20 75 6d 6f 75 6e 74 32 5f 66 6c 61 67 73 29  , umount2_flags)
2280: 3b 0a 0a 09 09 2f 2a 20 44 6f 20 6e 6f 74 20 72  ;..../* Do not r
2290: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 66  eturn an error f
22a0: 6f 72 20 74 68 69 73 20 63 61 73 65 2c 20 73 69  or this case, si
22b0: 6e 63 65 20 69 74 20 69 73 20 61 70 70 61 72 65  nce it is appare
22c0: 6e 74 6c 79 20 6e 6f 74 20 65 78 63 65 70 74 69  ntly not excepti
22d0: 6f 6e 61 6c 20 2a 2f 0a 09 09 69 66 20 28 63 68  onal */...if (ch
22e0: 6b 5f 72 65 74 20 21 3d 20 30 20 26 26 20 28 75  k_ret != 0 && (u
22f0: 6d 6f 75 6e 74 32 5f 66 6c 61 67 73 20 26 20 4d  mount2_flags & M
2300: 4e 54 5f 45 58 50 49 52 45 29 20 3d 3d 20 4d 4e  NT_EXPIRE) == MN
2310: 54 5f 45 58 50 49 52 45 20 26 26 20 65 72 72 6e  T_EXPIRE && errn
2320: 6f 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09  o == EAGAIN) {..
2330: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
2340: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2350: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 47 41  ewStringObj("AGA
2360: 49 4e 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 63  IN", -1));.....c
2370: 68 6b 5f 72 65 74 20 3d 20 30 3b 0a 09 09 7d 0a  hk_ret = 0;...}.
2380: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 68 6b 5f  .} else {...chk_
2390: 72 65 74 20 3d 20 75 6d 6f 75 6e 74 28 70 61 74  ret = umount(pat
23a0: 68 6e 61 6d 65 29 3b 0a 09 7d 0a 0a 09 69 66 20  hname);..}...if 
23b0: 28 63 68 6b 5f 72 65 74 20 21 3d 20 30 29 20 7b  (chk_ret != 0) {
23c0: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
23d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
23e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74 72  NewStringObj(str
23f0: 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20 2d 31  error(errno), -1
2400: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  ));....return(TC
2410: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72  L_ERROR);..}...r
2420: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d  eturn(TCL_OK);.}
2430: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61  ..static int tua
2440: 70 69 5f 73 77 61 70 6f 6e 28 43 6c 69 65 6e 74  pi_swapon(Client
2450: 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74  Data cd, Tcl_Int
2460: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
2470: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
2480: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a  CONST objv[]) {.
2490: 09 63 68 61 72 20 2a 70 61 74 68 6e 61 6d 65 3b  .char *pathname;
24a0: 0a 09 69 6e 74 20 63 68 6b 5f 72 65 74 3b 0a 0a  ..int chk_ret;..
24b0: 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20  .if (objc != 2) 
24c0: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
24d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
24e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77  _NewStringObj("w
24f0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2500: 75 6c 64 20 62 65 20 5c 22 74 75 61 70 69 3a 3a  uld be \"tuapi::
2510: 73 79 73 63 61 6c 6c 3a 3a 73 77 61 70 6f 6e 20  syscall::swapon 
2520: 70 61 74 68 6e 61 6d 65 5c 22 22 2c 20 2d 31 29  pathname\"", -1)
2530: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c  );....return(TCL
2540: 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 70 61  _ERROR);..}...pa
2550: 74 68 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  thname = Tcl_Get
2560: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
2570: 0a 0a 09 63 68 6b 5f 72 65 74 20 3d 20 73 77 61  ...chk_ret = swa
2580: 70 6f 6e 28 70 61 74 68 6e 61 6d 65 2c 20 30 29  pon(pathname, 0)
2590: 3b 0a 09 69 66 20 28 63 68 6b 5f 72 65 74 20 21  ;..if (chk_ret !
25a0: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  = 0) {...Tcl_Set
25b0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
25d0: 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e  bj(strerror(errn
25e0: 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74  o), -1));....ret
25f0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
2600: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  .}...return(TCL_
2610: 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OK);.}..static i
2620: 6e 74 20 74 75 61 70 69 5f 73 77 61 70 6f 66 66  nt tuapi_swapoff
2630: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20  (ClientData cd, 
2640: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2650: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
2660: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2670: 76 5b 5d 29 20 7b 0a 09 63 68 61 72 20 2a 70 61  v[]) {..char *pa
2680: 74 68 6e 61 6d 65 3b 0a 09 69 6e 74 20 63 68 6b  thname;..int chk
2690: 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63  _ret;...if (objc
26a0: 20 21 3d 20 32 29 20 7b 0a 09 09 54 63 6c 5f 53   != 2) {...Tcl_S
26b0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
26c0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
26d0: 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72  gObj("wrong # ar
26e0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
26f0: 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a  tuapi::syscall::
2700: 73 77 61 70 6f 66 66 20 70 61 74 68 6e 61 6d 65  swapoff pathname
2710: 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  \"", -1));....re
2720: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
2730: 0a 09 7d 0a 0a 09 70 61 74 68 6e 61 6d 65 20 3d  ..}...pathname =
2740: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2750: 62 6a 76 5b 31 5d 29 3b 0a 0a 09 63 68 6b 5f 72  bjv[1]);...chk_r
2760: 65 74 20 3d 20 73 77 61 70 6f 66 66 28 70 61 74  et = swapoff(pat
2770: 68 6e 61 6d 65 29 3b 0a 09 69 66 20 28 63 68 6b  hname);..if (chk
2780: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54  _ret != 0) {...T
2790: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
27a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
27b0: 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f  tringObj(strerro
27c0: 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a  r(errno), -1));.
27d0: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
27e0: 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ROR);..}...retur
27f0: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(TCL_OK);.}..st
2800: 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 69  atic int tuapi_i
2810: 6e 73 6d 6f 64 28 43 6c 69 65 6e 74 44 61 74 61  nsmod(ClientData
2820: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20   cd, Tcl_Interp 
2830: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
2840: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  c, Tcl_Obj *CONS
2850: 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c  T objv[]) {..Tcl
2860: 5f 43 68 61 6e 6e 65 6c 20 66 64 3b 0a 09 54 63  _Channel fd;..Tc
2870: 6c 5f 4f 62 6a 20 2a 6d 6f 64 75 6c 65 5f 66 69  l_Obj *module_fi
2880: 6c 65 6e 61 6d 65 2c 20 2a 6d 6f 64 75 6c 65 5f  lename, *module_
2890: 64 61 74 61 3b 0a 09 76 6f 69 64 20 2a 6d 6f 64  data;..void *mod
28a0: 75 6c 65 5f 64 61 74 61 5f 76 61 6c 3b 0a 09 63  ule_data_val;..c
28b0: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 75 6c  onst char *modul
28c0: 65 5f 6f 70 74 73 3b 0a 09 69 6e 74 20 6d 6f 64  e_opts;..int mod
28d0: 75 6c 65 5f 64 61 74 61 5f 6c 65 6e 3b 0a 09 69  ule_data_len;..i
28e0: 6e 74 20 72 65 61 64 5f 72 65 74 2c 20 63 68 6b  nt read_ret, chk
28f0: 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63  _ret;...if (objc
2900: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33   < 2 || objc > 3
2910: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ) {...Tcl_SetObj
2920: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2930: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2940: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2950: 68 6f 75 6c 64 20 62 65 20 5c 22 74 75 61 70 69  hould be \"tuapi
2960: 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69 6e 73 6d 6f  ::syscall::insmo
2970: 64 20 66 69 6c 65 6e 61 6d 65 20 3f 61 72 67 73  d filename ?args
2980: 3f 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  ?\"", -1));....r
2990: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
29a0: 3b 0a 09 7d 0a 0a 09 6d 6f 64 75 6c 65 5f 66 69  ;..}...module_fi
29b0: 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 76 5b 31 5d  lename = objv[1]
29c0: 3b 0a 0a 09 66 64 20 3d 20 54 63 6c 5f 46 53 4f  ;...fd = Tcl_FSO
29d0: 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69  penFileChannel(i
29e0: 6e 74 65 72 70 2c 20 6d 6f 64 75 6c 65 5f 66 69  nterp, module_fi
29f0: 6c 65 6e 61 6d 65 2c 20 22 72 22 2c 20 30 36 30  lename, "r", 060
2a00: 30 29 3b 0a 09 69 66 20 28 66 64 20 3d 3d 20 4e  0);..if (fd == N
2a10: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
2a20: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  TCL_ERROR);..}..
2a30: 09 63 68 6b 5f 72 65 74 20 3d 20 54 63 6c 5f 53  .chk_ret = Tcl_S
2a40: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
2a50: 69 6e 74 65 72 70 2c 20 66 64 2c 20 22 2d 74 72  interp, fd, "-tr
2a60: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e  anslation", "bin
2a70: 61 72 79 22 29 3b 0a 09 69 66 20 28 63 68 6b 5f  ary");..if (chk_
2a80: 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ret != TCL_OK) {
2a90: 0a 09 09 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74  ...Tcl_Close(int
2aa0: 65 72 70 2c 20 66 64 29 3b 0a 0a 09 09 72 65 74  erp, fd);....ret
2ab0: 75 72 6e 28 63 68 6b 5f 72 65 74 29 3b 0a 09 7d  urn(chk_ret);..}
2ac0: 0a 0a 09 6d 6f 64 75 6c 65 5f 64 61 74 61 20 3d  ...module_data =
2ad0: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 0a   Tcl_NewObj();..
2ae0: 09 72 65 61 64 5f 72 65 74 20 3d 20 54 63 6c 5f  .read_ret = Tcl_
2af0: 52 65 61 64 43 68 61 72 73 28 66 64 2c 20 6d 6f  ReadChars(fd, mo
2b00: 64 75 6c 65 5f 64 61 74 61 2c 20 2d 31 2c 20 30  dule_data, -1, 0
2b10: 29 3b 0a 0a 09 54 63 6c 5f 43 6c 6f 73 65 28 69  );...Tcl_Close(i
2b20: 6e 74 65 72 70 2c 20 66 64 29 3b 0a 0a 09 69 66  nterp, fd);...if
2b30: 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29   (read_ret <= 0)
2b40: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
2b50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2b60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2b70: 72 65 61 64 20 66 61 69 6c 65 64 22 2c 20 2d 31  read failed", -1
2b80: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  ));....return(TC
2b90: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d  L_ERROR);..}...m
2ba0: 6f 64 75 6c 65 5f 64 61 74 61 5f 76 61 6c 20 3d  odule_data_val =
2bb0: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
2bc0: 79 46 72 6f 6d 4f 62 6a 28 6d 6f 64 75 6c 65 5f  yFromObj(module_
2bd0: 64 61 74 61 2c 20 26 6d 6f 64 75 6c 65 5f 64 61  data, &module_da
2be0: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 6f  ta_len);...if (o
2bf0: 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 09 6d 6f  bjc == 3) {...mo
2c00: 64 75 6c 65 5f 6f 70 74 73 20 3d 20 54 63 6c 5f  dule_opts = Tcl_
2c10: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2c20: 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ]);..} else {...
2c30: 6d 6f 64 75 6c 65 5f 6f 70 74 73 20 3d 20 22 22  module_opts = ""
2c40: 3b 0a 09 7d 0a 0a 09 63 68 6b 5f 72 65 74 20 3d  ;..}...chk_ret =
2c50: 20 69 6e 69 74 5f 6d 6f 64 75 6c 65 28 6d 6f 64   init_module(mod
2c60: 75 6c 65 5f 64 61 74 61 5f 76 61 6c 2c 20 6d 6f  ule_data_val, mo
2c70: 64 75 6c 65 5f 64 61 74 61 5f 6c 65 6e 2c 20 6d  dule_data_len, m
2c80: 6f 64 75 6c 65 5f 6f 70 74 73 29 3b 0a 09 69 66  odule_opts);..if
2c90: 20 28 63 68 6b 5f 72 65 74 20 21 3d 20 30 29 20   (chk_ret != 0) 
2ca0: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
2cb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2cc0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74  _NewStringObj(st
2cd0: 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20 2d  rerror(errno), -
2ce0: 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54  1));....return(T
2cf0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  CL_ERROR);..}...
2d00: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
2d10: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
2d20: 61 70 69 5f 72 6d 6d 6f 64 28 43 6c 69 65 6e 74  api_rmmod(Client
2d30: 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74  Data cd, Tcl_Int
2d40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
2d50: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
2d60: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a  CONST objv[]) {.
2d70: 09 63 68 61 72 20 2a 6d 6f 64 75 6c 65 3b 0a 09  .char *module;..
2d80: 69 6e 74 20 69 64 78 3b 0a 09 69 6e 74 20 64 65  int idx;..int de
2d90: 6c 65 74 65 5f 6d 6f 64 75 6c 65 5f 72 65 74 3b  lete_module_ret;
2da0: 0a 0a 09 69 66 20 28 6f 62 6a 63 20 3c 20 32 29  ...if (objc < 2)
2db0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
2dc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2dd0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2de0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2df0: 6f 75 6c 64 20 62 65 20 5c 22 74 75 61 70 69 3a  ould be \"tuapi:
2e00: 3a 73 79 73 63 61 6c 6c 3a 3a 72 6d 6d 6f 64 20  :syscall::rmmod 
2e10: 6d 6f 64 75 6c 65 20 3f 6d 6f 64 75 6c 65 2e 2e  module ?module..
2e20: 2e 3f 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  .?", -1));....re
2e30: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
2e40: 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
2e50: 20 31 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   1; idx < objc; 
2e60: 69 64 78 2b 2b 29 20 7b 0a 09 09 6d 6f 64 75 6c  idx++) {...modul
2e70: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
2e80: 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09  g(objv[idx]);...
2e90: 09 64 65 6c 65 74 65 5f 6d 6f 64 75 6c 65 5f 72  .delete_module_r
2ea0: 65 74 20 3d 20 64 65 6c 65 74 65 5f 6d 6f 64 75  et = delete_modu
2eb0: 6c 65 28 6d 6f 64 75 6c 65 2c 20 4f 5f 4e 4f 4e  le(module, O_NON
2ec0: 42 4c 4f 43 4b 29 3b 0a 09 09 69 66 20 28 64 65  BLOCK);...if (de
2ed0: 6c 65 74 65 5f 6d 6f 64 75 6c 65 5f 72 65 74 20  lete_module_ret 
2ee0: 21 3d 20 30 29 20 7b 0a 09 09 09 54 63 6c 5f 53  != 0) {....Tcl_S
2ef0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2f00: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
2f10: 66 28 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 6d  f("unable to rem
2f20: 6f 76 65 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c  ove \"%s\": %s",
2f30: 20 6d 6f 64 75 6c 65 2c 20 73 74 72 65 72 72 6f   module, strerro
2f40: 72 28 65 72 72 6e 6f 29 29 29 3b 0a 0a 09 09 09  r(errno)));.....
2f50: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
2f60: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  );...}..}...retu
2f70: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73  rn(TCL_OK);.}..s
2f80: 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
2f90: 6c 73 6d 6f 64 28 43 6c 69 65 6e 74 44 61 74 61  lsmod(ClientData
2fa0: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20   cd, Tcl_Interp 
2fb0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
2fc0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  c, Tcl_Obj *CONS
2fd0: 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c  T objv[]) {..Tcl
2fe0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2ff0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
3000: 69 6e 67 4f 62 6a 28 22 6e 6f 74 20 69 6d 70 6c  ingObj("not impl
3010: 65 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29 3b 0a  emented", -1));.
3020: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
3030: 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OR);.}..static i
3040: 6e 74 20 74 75 61 70 69 5f 68 6f 73 74 6e 61 6d  nt tuapi_hostnam
3050: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c  e(ClientData cd,
3060: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3070: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
3080: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
3090: 6a 76 5b 5d 29 20 7b 0a 09 63 68 61 72 20 68 6f  jv[]) {..char ho
30a0: 73 74 6e 61 6d 65 5b 48 4f 53 54 5f 4e 41 4d 45  stname[HOST_NAME
30b0: 5f 4d 41 58 20 2b 20 31 5d 3b 0a 09 69 6e 74 20  _MAX + 1];..int 
30c0: 63 68 6b 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f  chk_ret;...if (o
30d0: 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 09 2f 2a  bjc == 1) {.../*
30e0: 20 4e 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69   No arguments gi
30f0: 76 65 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ven, just return
3100: 20 74 68 65 20 68 6f 73 74 6e 61 6d 65 20 2a 2f   the hostname */
3110: 0a 09 09 63 68 6b 5f 72 65 74 20 3d 20 67 65 74  ...chk_ret = get
3120: 68 6f 73 74 6e 61 6d 65 28 68 6f 73 74 6e 61 6d  hostname(hostnam
3130: 65 2c 20 73 69 7a 65 6f 66 28 68 6f 73 74 6e 61  e, sizeof(hostna
3140: 6d 65 29 29 3b 0a 09 09 69 66 20 28 63 68 6b 5f  me));...if (chk_
3150: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 54  ret != 0) {....T
3160: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
3170: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
3180: 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f  tringObj(strerro
3190: 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a  r(errno), -1));.
31a0: 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
31b0: 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 68 6f  RROR);...}....ho
31c0: 73 74 6e 61 6d 65 5b 73 69 7a 65 6f 66 28 68 6f  stname[sizeof(ho
31d0: 73 74 6e 61 6d 65 29 20 2d 20 31 5d 20 3d 20 27  stname) - 1] = '
31e0: 5c 30 27 3b 0a 0a 09 09 54 63 6c 5f 53 65 74 4f  \0';....Tcl_SetO
31f0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
3200: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3210: 6a 28 68 6f 73 74 6e 61 6d 65 2c 20 2d 31 29 29  j(hostname, -1))
3220: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  ;....return(TCL_
3230: 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 62  OK);..}...if (ob
3240: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 09 2f 2a 20  jc == 2) {.../* 
3250: 45 78 61 63 74 6c 79 20 6f 6e 65 20 61 72 67 75  Exactly one argu
3260: 6d 65 6e 74 20 67 69 76 65 6e 2c 20 73 65 74 20  ment given, set 
3270: 74 68 65 20 68 6f 73 74 6e 61 6d 65 20 2a 2f 0a  the hostname */.
3280: 09 09 73 74 72 6e 63 70 79 28 68 6f 73 74 6e 61  ..strncpy(hostna
3290: 6d 65 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  me, Tcl_GetStrin
32a0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 73 69 7a 65  g(objv[1]), size
32b0: 6f 66 28 68 6f 73 74 6e 61 6d 65 29 29 3b 0a 09  of(hostname));..
32c0: 09 68 6f 73 74 6e 61 6d 65 5b 73 69 7a 65 6f 66  .hostname[sizeof
32d0: 28 68 6f 73 74 6e 61 6d 65 29 20 2d 20 31 5d 20  (hostname) - 1] 
32e0: 3d 20 27 5c 30 27 3b 0a 0a 09 09 63 68 6b 5f 72  = '\0';....chk_r
32f0: 65 74 20 3d 20 73 65 74 68 6f 73 74 6e 61 6d 65  et = sethostname
3300: 28 68 6f 73 74 6e 61 6d 65 2c 20 73 74 72 6c 65  (hostname, strle
3310: 6e 28 68 6f 73 74 6e 61 6d 65 29 29 3b 0a 09 09  n(hostname));...
3320: 69 66 20 28 63 68 6b 5f 72 65 74 20 21 3d 20 30  if (chk_ret != 0
3330: 29 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62  ) {....Tcl_SetOb
3340: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
3350: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3360: 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29  (strerror(errno)
3370: 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74 75  , -1));.....retu
3380: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
3390: 09 7d 0a 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  .}....Tcl_SetObj
33a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
33b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
33c0: 68 6f 73 74 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  hostname, -1));.
33d0: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b  ...return(TCL_OK
33e0: 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 53 65 74 4f  );..}...Tcl_SetO
33f0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
3400: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3410: 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  j("wrong # args:
3420: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 68 6f 73   should be \"hos
3430: 74 6e 61 6d 65 20 3f 68 6f 73 74 6e 61 6d 65 3f  tname ?hostname?
3440: 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74  \"", -1));...ret
3450: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
3460: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
3470: 61 70 69 5f 64 6f 6d 61 69 6e 6e 61 6d 65 28 43  api_domainname(C
3480: 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63  lientData cd, Tc
3490: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
34a0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
34b0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
34c0: 5d 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  ]) {..Tcl_SetObj
34d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
34e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
34f0: 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64  "not implemented
3500: 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72  ", -1));...retur
3510: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  n(TCL_ERROR);.}.
3520: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70  .static int tuap
3530: 69 5f 63 68 72 6f 6f 74 28 43 6c 69 65 6e 74 44  i_chroot(ClientD
3540: 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65  ata cd, Tcl_Inte
3550: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
3560: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43  objc, Tcl_Obj *C
3570: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09  ONST objv[]) {..
3580: 63 68 61 72 20 2a 70 61 74 68 6e 61 6d 65 3b 0a  char *pathname;.
3590: 09 69 6e 74 20 63 68 6b 5f 72 65 74 3b 0a 0a 09  .int chk_ret;...
35a0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
35b0: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
35c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
35d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 72  NewStringObj("wr
35e0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
35f0: 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a  ld be \"::tuapi:
3600: 3a 73 79 73 63 61 6c 6c 3a 63 68 72 6f 6f 74 20  :syscall:chroot 
3610: 70 61 74 68 6e 61 6d 65 5c 22 22 2c 20 2d 31 29  pathname\"", -1)
3620: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c  );....return(TCL
3630: 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 70 61  _ERROR);..}...pa
3640: 74 68 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  thname = Tcl_Get
3650: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
3660: 0a 0a 09 63 68 6b 5f 72 65 74 20 3d 20 63 68 72  ...chk_ret = chr
3670: 6f 6f 74 28 70 61 74 68 6e 61 6d 65 29 3b 0a 09  oot(pathname);..
3680: 69 66 20 28 63 68 6b 5f 72 65 74 20 21 3d 20 30  if (chk_ret != 0
3690: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ) {...Tcl_SetObj
36a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
36b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
36c0: 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c  strerror(errno),
36d0: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
36e0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
36f0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29  ..return(TCL_OK)
3700: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
3710: 74 75 61 70 69 5f 70 69 76 6f 74 5f 72 6f 6f 74  tuapi_pivot_root
3720: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20  (ClientData cd, 
3730: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3740: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
3750: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
3760: 76 5b 5d 29 20 7b 0a 09 63 68 61 72 20 2a 6e 65  v[]) {..char *ne
3770: 77 5f 72 6f 6f 74 2c 20 2a 70 75 74 5f 6f 6c 64  w_root, *put_old
3780: 3b 0a 09 69 6e 74 20 63 68 6b 5f 72 65 74 3b 0a  ;..int chk_ret;.
3790: 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29  ..if (objc != 3)
37a0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
37b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
37c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
37d0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
37e0: 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70  ould be \"::tuap
37f0: 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 70 69 76 6f  i::syscall::pivo
3800: 74 5f 72 6f 6f 74 20 6e 65 77 5f 72 6f 6f 74 20  t_root new_root 
3810: 70 75 74 5f 6f 6c 64 5c 22 22 2c 20 2d 31 29 29  put_old\"", -1))
3820: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  ;....return(TCL_
3830: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6e 65 77  ERROR);..}...new
3840: 5f 72 6f 6f 74 20 3d 20 54 63 6c 5f 47 65 74 53  _root = Tcl_GetS
3850: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
3860: 09 70 75 74 5f 6f 6c 64 20 3d 20 54 63 6c 5f 47  .put_old = Tcl_G
3870: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
3880: 29 3b 0a 0a 09 63 68 6b 5f 72 65 74 20 3d 20 70  );...chk_ret = p
3890: 69 76 6f 74 5f 72 6f 6f 74 28 6e 65 77 5f 72 6f  ivot_root(new_ro
38a0: 6f 74 2c 20 70 75 74 5f 6f 6c 64 29 3b 0a 09 69  ot, put_old);..i
38b0: 66 20 28 63 68 6b 5f 72 65 74 20 21 3d 20 30 29  f (chk_ret != 0)
38c0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
38d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
38e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
38f0: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20  trerror(errno), 
3900: 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  -1));....return(
3910: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  TCL_ERROR);..}..
3920: 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
3930: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
3940: 75 61 70 69 5f 6d 6b 6e 6f 64 28 43 6c 69 65 6e  uapi_mknod(Clien
3950: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
3960: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
3970: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
3980: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
3990: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
39a0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
39b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74  ewStringObj("not
39c0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d   implemented", -
39d0: 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43  1));...return(TC
39e0: 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61  L_ERROR);.}..sta
39f0: 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 73 65  tic int tuapi_se
3a00: 74 75 69 64 28 43 6c 69 65 6e 74 44 61 74 61 20  tuid(ClientData 
3a10: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  cd, Tcl_Interp *
3a20: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
3a30: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54  , Tcl_Obj *CONST
3a40: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f   objv[]) {..Tcl_
3a50: 57 69 64 65 49 6e 74 20 74 63 6c 55 69 64 3b 0a  WideInt tclUid;.
3a60: 09 75 69 64 5f 74 20 75 69 64 3b 0a 09 69 6e 74  .uid_t uid;..int
3a70: 20 63 68 6b 5f 72 65 74 3b 0a 0a 09 69 66 20 28   chk_ret;...if (
3a80: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 09 54  objc != 2) {...T
3a90: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
3aa0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
3ab0: 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20  tringObj("wrong 
3ac0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3ad0: 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  e \"::tuapi::sys
3ae0: 63 61 6c 6c 3a 3a 73 65 74 75 69 64 20 75 69 64  call::setuid uid
3af0: 5c 22 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 0a 09  \"", -1));..}...
3b00: 63 68 6b 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65  chk_ret = Tcl_Ge
3b10: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
3b20: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
3b30: 20 26 74 63 6c 55 69 64 29 3b 0a 09 69 66 20 28   &tclUid);..if (
3b40: 63 68 6b 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  chk_ret != TCL_O
3b50: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 63 68  K) {...return(ch
3b60: 6b 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 75 69 64  k_ret);..}...uid
3b70: 20 3d 20 74 63 6c 55 69 64 3b 0a 0a 09 63 68 6b   = tclUid;...chk
3b80: 5f 72 65 74 20 3d 20 73 65 74 75 69 64 28 75 69  _ret = setuid(ui
3b90: 64 29 3b 0a 09 69 66 20 28 63 68 6b 5f 72 65 74  d);..if (chk_ret
3ba0: 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53   != 0) {...Tcl_S
3bb0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3bc0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
3bd0: 67 4f 62 6a 28 22 73 65 74 75 69 64 20 66 61 69  gObj("setuid fai
3be0: 6c 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  led", -1));....r
3bf0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
3c00: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 53 65 74 4f 62  ;..}...Tcl_SetOb
3c10: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
3c20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3c30: 28 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74  ("", -1));...ret
3c40: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(TCL_OK);.}..
3c50: 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69  static int tuapi
3c60: 5f 67 65 74 75 69 64 28 43 6c 69 65 6e 74 44 61  _getuid(ClientDa
3c70: 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  ta cd, Tcl_Inter
3c80: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
3c90: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
3ca0: 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 75  NST objv[]) {..u
3cb0: 69 64 5f 74 20 75 69 64 3b 0a 09 54 63 6c 5f 57  id_t uid;..Tcl_W
3cc0: 69 64 65 49 6e 74 20 74 63 6c 55 69 64 3b 0a 0a  ideInt tclUid;..
3cd0: 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20  .if (objc != 1) 
3ce0: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
3cf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
3d00: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77  _NewStringObj("w
3d10: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3d20: 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70 69  uld be \"::tuapi
3d30: 3a 3a 73 79 73 63 61 6c 6c 3a 3a 67 65 74 75 69  ::syscall::getui
3d40: 64 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  d\"", -1));....r
3d50: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
3d60: 3b 0a 09 7d 0a 0a 09 75 69 64 20 3d 20 67 65 74  ;..}...uid = get
3d70: 75 69 64 28 29 3b 0a 09 74 63 6c 55 69 64 20 3d  uid();..tclUid =
3d80: 20 75 69 64 3b 0a 0a 09 54 63 6c 5f 53 65 74 4f   uid;...Tcl_SetO
3d90: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
3da0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
3db0: 62 6a 28 74 63 6c 55 69 64 29 29 3b 0a 0a 09 72  bj(tclUid));...r
3dc0: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d  eturn(TCL_OK);.}
3dd0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61  ..static int tua
3de0: 70 69 5f 6b 69 6c 6c 28 43 6c 69 65 6e 74 44 61  pi_kill(ClientDa
3df0: 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  ta cd, Tcl_Inter
3e00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
3e10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
3e20: 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54  NST objv[]) {..T
3e30: 63 6c 5f 4f 62 6a 20 2a 73 69 67 6e 61 6c 5f 6f  cl_Obj *signal_o
3e40: 62 6a 3b 0a 0a 09 54 63 6c 5f 57 69 64 65 49 6e  bj;...Tcl_WideIn
3e50: 74 20 70 69 64 5f 77 69 64 65 2c 20 73 69 67 5f  t pid_wide, sig_
3e60: 77 69 64 65 3b 0a 09 70 69 64 5f 74 20 70 69 64  wide;..pid_t pid
3e70: 3b 0a 09 69 6e 74 20 73 69 67 3b 0a 09 69 6e 74  ;..int sig;..int
3e80: 20 6b 69 6c 6c 5f 72 65 74 2c 20 74 63 6c 5f 72   kill_ret, tcl_r
3e90: 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 21  et;...if (objc !
3ea0: 3d 20 33 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  = 3) {...Tcl_Set
3eb0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3ed0: 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73  bj("wrong # args
3ee0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a  : should be \"::
3ef0: 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a  tuapi::syscall::
3f00: 6b 69 6c 6c 20 70 69 64 20 73 69 67 5c 22 22 2c  kill pid sig\"",
3f10: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
3f20: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
3f30: 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f  ..tcl_ret = Tcl_
3f40: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
3f50: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
3f60: 5d 2c 20 26 70 69 64 5f 77 69 64 65 29 3b 0a 09  ], &pid_wide);..
3f70: 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54  if (tcl_ret != T
3f80: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72  CL_OK) {...retur
3f90: 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09 7d 0a 09  n(tcl_ret);..}..
3fa0: 70 69 64 20 3d 20 70 69 64 5f 77 69 64 65 3b 0a  pid = pid_wide;.
3fb0: 0a 09 73 69 67 6e 61 6c 5f 6f 62 6a 20 3d 20 6f  ..signal_obj = o
3fc0: 62 6a 76 5b 32 5d 3b 0a 0a 09 74 63 6c 5f 72 65  bjv[2];...tcl_re
3fd0: 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49  t = Tcl_GetWideI
3fe0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
3ff0: 2c 20 73 69 67 6e 61 6c 5f 6f 62 6a 2c 20 26 73  , signal_obj, &s
4000: 69 67 5f 77 69 64 65 29 3b 0a 09 69 66 20 28 74  ig_wide);..if (t
4010: 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b  cl_ret != TCL_OK
4020: 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 74 75  ) {...switch (tu
4030: 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d  api_internal_sim
4040: 70 6c 65 68 61 73 68 5f 6f 62 6a 28 73 69 67 6e  plehash_obj(sign
4050: 61 6c 5f 6f 62 6a 29 29 20 7b 0a 09 09 09 63 61  al_obj)) {....ca
4060: 73 65 20 30 78 31 32 32 61 64 30 3a 20 2f 2a 20  se 0x122ad0: /* 
4070: 48 55 50 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  HUP */....case 0
4080: 78 39 38 66 33 36 34 64 30 3a 20 2f 2a 20 53 49  x98f364d0: /* SI
4090: 47 48 55 50 20 2a 2f 0a 09 09 09 09 73 69 67 20  GHUP */.....sig 
40a0: 3d 20 53 49 47 48 55 50 3b 0a 09 09 09 09 62 72  = SIGHUP;.....br
40b0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 31  eak;....case 0x1
40c0: 32 36 37 35 34 3a 20 2f 2a 20 49 4e 54 20 2a 2f  26754: /* INT */
40d0: 0a 09 09 09 63 61 73 65 20 30 78 39 38 66 33 32  ....case 0x98f32
40e0: 39 35 34 3a 20 2f 2a 20 53 49 47 49 4e 54 20 2a  954: /* SIGINT *
40f0: 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 49  /.....sig = SIGI
4100: 4e 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  NT;.....break;..
4110: 09 09 63 61 73 65 20 30 78 61 33 35 36 34 64 34  ..case 0xa3564d4
4120: 3a 20 2f 2a 20 51 55 49 54 20 2a 2f 0a 09 09 09  : /* QUIT */....
4130: 63 61 73 65 20 30 78 37 61 39 32 34 32 64 34 3a  case 0x7a9242d4:
4140: 20 2f 2a 20 53 49 47 51 55 49 54 20 2a 2f 0a 09   /* SIGQUIT */..
4150: 09 09 09 73 69 67 20 3d 20 53 49 47 51 55 49 54  ...sig = SIGQUIT
4160: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
4170: 63 61 73 65 20 30 78 31 32 36 36 34 63 3a 20 2f  case 0x12664c: /
4180: 2a 20 49 4c 4c 20 2a 2f 0a 09 09 09 63 61 73 65  * ILL */....case
4190: 20 30 78 39 38 66 33 32 38 34 63 3a 20 2f 2a 20   0x98f3284c: /* 
41a0: 53 49 47 49 4c 4c 20 2a 2f 0a 09 09 09 09 73 69  SIGILL */.....si
41b0: 67 20 3d 20 53 49 47 49 4c 4c 3b 0a 09 09 09 09  g = SIGILL;.....
41c0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
41d0: 78 61 39 34 61 30 64 30 3a 20 2f 2a 20 54 52 41  xa94a0d0: /* TRA
41e0: 50 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37  P */....case 0x7
41f0: 61 33 33 38 36 64 30 3a 20 2f 2a 20 53 49 47 54  a3386d0: /* SIGT
4200: 52 41 50 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d  RAP */.....sig =
4210: 20 53 49 47 54 52 41 50 3b 0a 09 09 09 09 62 72   SIGTRAP;.....br
4220: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 38  eak;....case 0x8
4230: 33 30 61 39 35 34 3a 20 2f 2a 20 41 42 52 54 20  30a954: /* ABRT 
4240: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 38 39  */....case 0x789
4250: 37 38 66 35 34 3a 20 2f 2a 20 53 49 47 41 42 52  78f54: /* SIGABR
4260: 54 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53  T */.....sig = S
4270: 49 47 41 42 52 54 3b 0a 09 09 09 09 62 72 65 61  IGABRT;.....brea
4280: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 31 32 36  k;....case 0x126
4290: 37 64 34 3a 20 2f 2a 20 49 4f 54 20 2a 2f 0a 09  7d4: /* IOT */..
42a0: 09 09 63 61 73 65 20 30 78 39 38 66 33 32 39 64  ..case 0x98f329d
42b0: 34 3a 20 2f 2a 20 53 49 47 49 4f 54 20 2a 2f 0a  4: /* SIGIOT */.
42c0: 09 09 09 09 73 69 67 20 3d 20 53 49 47 49 4f 54  ....sig = SIGIOT
42d0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
42e0: 63 61 73 65 20 30 78 31 30 61 61 64 33 3a 20 2f  case 0x10aad3: /
42f0: 2a 20 42 55 53 20 2a 2f 0a 09 09 09 63 61 73 65  * BUS */....case
4300: 20 30 78 39 38 66 31 65 34 64 33 3a 20 2f 2a 20   0x98f1e4d3: /* 
4310: 53 49 47 42 55 53 20 2a 2f 0a 09 09 09 09 73 69  SIGBUS */.....si
4320: 67 20 3d 20 53 49 47 42 55 53 3b 0a 09 09 09 09  g = SIGBUS;.....
4330: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
4340: 78 31 31 61 38 34 35 3a 20 2f 2a 20 46 50 45 20  x11a845: /* FPE 
4350: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 39 38 66  */....case 0x98f
4360: 30 65 36 34 35 3a 20 2f 2a 20 53 49 47 46 50 45  0e645: /* SIGFPE
4370: 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49   */.....sig = SI
4380: 47 46 50 45 3b 0a 09 09 09 09 62 72 65 61 6b 3b  GFPE;.....break;
4390: 0a 09 09 09 63 61 73 65 20 30 78 39 37 32 36 36  ....case 0x97266
43a0: 34 63 3a 20 2f 2a 20 4b 49 4c 4c 20 2a 2f 0a 09  4c: /* KILL */..
43b0: 09 09 63 61 73 65 20 30 78 37 39 64 35 34 30 34  ..case 0x79d5404
43c0: 63 3a 20 2f 2a 20 53 49 47 4b 49 4c 4c 20 2a 2f  c: /* SIGKILL */
43d0: 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 4b 49  .....sig = SIGKI
43e0: 4c 4c 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  LL;.....break;..
43f0: 09 09 63 61 73 65 20 30 78 61 62 34 65 39 33 31  ..case 0xab4e931
4400: 3a 20 2f 2a 20 55 53 52 31 20 2a 2f 0a 09 09 09  : /* USR1 */....
4410: 63 61 73 65 20 30 78 37 61 31 33 63 66 33 31 3a  case 0x7a13cf31:
4420: 20 2f 2a 20 53 49 47 55 53 52 31 20 2a 2f 0a 09   /* SIGUSR1 */..
4430: 09 09 09 73 69 67 20 3d 20 53 49 47 55 53 52 31  ...sig = SIGUSR1
4440: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
4450: 63 61 73 65 20 30 78 61 37 31 36 33 64 36 3a 20  case 0xa7163d6: 
4460: 2f 2a 20 53 45 47 56 20 2a 2f 0a 09 09 09 63 61  /* SEGV */....ca
4470: 73 65 20 30 78 37 61 64 36 34 35 64 36 3a 20 2f  se 0x7ad645d6: /
4480: 2a 20 53 49 47 53 45 47 56 20 2a 2f 0a 09 09 09  * SIGSEGV */....
4490: 09 73 69 67 20 3d 20 53 49 47 53 45 47 56 3b 0a  .sig = SIGSEGV;.
44a0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
44b0: 73 65 20 30 78 61 62 34 65 39 33 32 3a 20 2f 2a  se 0xab4e932: /*
44c0: 20 55 53 52 32 20 2a 2f 0a 09 09 09 63 61 73 65   USR2 */....case
44d0: 20 30 78 37 61 31 33 63 66 33 32 3a 20 2f 2a 20   0x7a13cf32: /* 
44e0: 53 49 47 55 53 52 32 20 2a 2f 0a 09 09 09 09 73  SIGUSR2 */.....s
44f0: 69 67 20 3d 20 53 49 47 55 53 52 32 3b 0a 09 09  ig = SIGUSR2;...
4500: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
4510: 20 30 78 61 31 32 36 38 34 35 3a 20 2f 2a 20 50   0xa126845: /* P
4520: 49 50 45 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  IPE */....case 0
4530: 78 37 61 62 35 34 65 34 35 3a 20 2f 2a 20 53 49  x7ab54e45: /* SI
4540: 47 50 49 50 45 20 2a 2f 0a 09 09 09 09 73 69 67  GPIPE */.....sig
4550: 20 3d 20 53 49 47 50 49 50 45 3b 0a 09 09 09 09   = SIGPIPE;.....
4560: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
4570: 78 38 33 33 32 39 34 64 3a 20 2f 2a 20 41 4c 52  x833294d: /* ALR
4580: 4d 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37  M */....case 0x7
4590: 38 39 34 30 66 34 64 3a 20 2f 2a 20 53 49 47 41  8940f4d: /* SIGA
45a0: 4c 52 4d 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d  LRM */.....sig =
45b0: 20 53 49 47 41 4c 52 4d 3b 0a 09 09 09 09 62 72   SIGALRM;.....br
45c0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 61  eak;....case 0xa
45d0: 39 31 36 39 34 64 3a 20 2f 2a 20 54 45 52 4d 20  91694d: /* TERM 
45e0: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 61 33  */....case 0x7a3
45f0: 36 34 66 34 64 3a 20 2f 2a 20 53 49 47 54 45 52  64f4d: /* SIGTER
4600: 4d 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53  M */.....sig = S
4610: 49 47 54 45 52 4d 3b 0a 09 09 09 09 62 72 65 61  IGTERM;.....brea
4620: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 34 39 37  k;....case 0x497
4630: 30 65 38 64 34 3a 20 2f 2a 20 53 54 4b 46 4c 54  0e8d4: /* STKFLT
4640: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 38 30   */....case 0x80
4650: 66 65 66 63 35 34 3a 20 2f 2a 20 53 49 47 53 54  fefc54: /* SIGST
4660: 4b 46 4c 54 20 2a 2f 0a 09 09 09 09 73 69 67 20  KFLT */.....sig 
4670: 3d 20 53 49 47 53 54 4b 46 4c 54 3b 0a 09 09 09  = SIGSTKFLT;....
4680: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
4690: 30 78 38 37 32 32 36 34 34 3a 20 2f 2a 20 43 48  0x8722644: /* CH
46a0: 4c 44 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  LD */....case 0x
46b0: 37 38 64 35 30 30 34 34 3a 20 2f 2a 20 53 49 47  78d50044: /* SIG
46c0: 43 48 4c 44 20 2a 2f 0a 09 09 09 09 73 69 67 20  CHLD */.....sig 
46d0: 3d 20 53 49 47 43 48 4c 44 3b 0a 09 09 09 09 62  = SIGCHLD;.....b
46e0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
46f0: 38 37 33 65 37 35 34 3a 20 2f 2a 20 43 4f 4e 54  873e754: /* CONT
4700: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 38   */....case 0x78
4710: 64 34 63 31 35 34 3a 20 2f 2a 20 53 49 47 43 4f  d4c154: /* SIGCO
4720: 4e 54 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20  NT */.....sig = 
4730: 53 49 47 43 4f 4e 54 3b 0a 09 09 09 09 62 72 65  SIGCONT;.....bre
4740: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 61 37  ak;....case 0xa7
4750: 35 32 37 64 30 3a 20 2f 2a 20 53 54 4f 50 20 2a  527d0: /* STOP *
4760: 2f 0a 09 09 09 63 61 73 65 20 30 78 37 61 64 32  /....case 0x7ad2
4770: 30 31 64 30 3a 20 2f 2a 20 53 49 47 53 54 4f 50  01d0: /* SIGSTOP
4780: 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49   */.....sig = SI
4790: 47 53 54 4f 50 3b 0a 09 09 09 09 62 72 65 61 6b  GSTOP;.....break
47a0: 3b 0a 09 09 09 63 61 73 65 20 30 78 61 39 34 65  ;....case 0xa94e
47b0: 61 35 30 3a 20 2f 2a 20 54 53 54 50 20 2a 2f 0a  a50: /* TSTP */.
47c0: 09 09 09 63 61 73 65 20 30 78 37 61 33 33 63 63  ...case 0x7a33cc
47d0: 35 30 3a 20 2f 2a 20 53 49 47 54 53 54 50 20 2a  50: /* SIGTSTP *
47e0: 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 54  /.....sig = SIGT
47f0: 53 54 50 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  STP;.....break;.
4800: 09 09 09 63 61 73 65 20 30 78 61 39 35 32 34 63  ...case 0xa9524c
4810: 65 3a 20 2f 2a 20 54 54 49 4e 20 2a 2f 0a 09 09  e: /* TTIN */...
4820: 09 63 61 73 65 20 30 78 37 61 33 32 30 32 63 65  .case 0x7a3202ce
4830: 3a 20 2f 2a 20 53 49 47 54 54 49 4e 20 2a 2f 0a  : /* SIGTTIN */.
4840: 09 09 09 09 73 69 67 20 3d 20 53 49 47 54 54 49  ....sig = SIGTTI
4850: 4e 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  N;.....break;...
4860: 09 63 61 73 65 20 30 78 61 39 35 32 37 64 35 3a  .case 0xa9527d5:
4870: 20 2f 2a 20 54 54 4f 55 20 2a 2f 0a 09 09 09 63   /* TTOU */....c
4880: 61 73 65 20 30 78 37 61 33 32 30 31 64 35 3a 20  ase 0x7a3201d5: 
4890: 2f 2a 20 53 49 47 54 54 4f 55 20 2a 2f 0a 09 09  /* SIGTTOU */...
48a0: 09 09 73 69 67 20 3d 20 53 49 47 54 54 4f 55 3b  ..sig = SIGTTOU;
48b0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
48c0: 61 73 65 20 30 78 31 35 36 39 34 37 3a 20 2f 2a  ase 0x156947: /*
48d0: 20 55 52 47 20 2a 2f 0a 09 09 09 63 61 73 65 20   URG */....case 
48e0: 30 78 39 38 66 34 32 37 34 37 3a 20 2f 2a 20 53  0x98f42747: /* S
48f0: 49 47 55 52 47 20 2a 2f 0a 09 09 09 09 73 69 67  IGURG */.....sig
4900: 20 3d 20 53 49 47 55 52 47 3b 0a 09 09 09 09 62   = SIGURG;.....b
4910: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
4920: 62 31 30 65 38 35 35 3a 20 2f 2a 20 58 43 50 55  b10e855: /* XCPU
4930: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 62   */....case 0x7b
4940: 62 37 63 65 35 35 3a 20 2f 2a 20 53 49 47 58 43  b7ce55: /* SIGXC
4950: 50 55 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20  PU */.....sig = 
4960: 53 49 47 58 43 50 55 3b 0a 09 09 09 09 62 72 65  SIGXCPU;.....bre
4970: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 62 31  ak;....case 0xb1
4980: 31 61 39 64 61 3a 20 2f 2a 20 58 46 53 5a 20 2a  1a9da: /* XFSZ *
4990: 2f 0a 09 09 09 63 61 73 65 20 30 78 37 62 62 36  /....case 0x7bb6
49a0: 38 66 64 61 3a 20 2f 2a 20 53 49 47 58 46 53 5a  8fda: /* SIGXFSZ
49b0: 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49   */.....sig = SI
49c0: 47 58 46 53 5a 3b 0a 09 09 09 09 62 72 65 61 6b  GXFSZ;.....break
49d0: 3b 0a 09 09 09 63 61 73 65 20 30 78 34 38 33 32  ;....case 0x4832
49e0: 37 33 63 64 3a 20 2f 2a 20 56 54 41 4c 52 4d 20  73cd: /* VTALRM 
49f0: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 38 31 62  */....case 0x81b
4a00: 63 36 37 34 64 3a 20 2f 2a 20 53 49 47 56 54 41  c674d: /* SIGVTA
4a10: 4c 52 4d 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d  LRM */.....sig =
4a20: 20 53 49 47 56 54 41 4c 52 4d 3b 0a 09 09 09 09   SIGVTALRM;.....
4a30: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
4a40: 78 61 31 34 61 37 63 36 3a 20 2f 2a 20 50 52 4f  xa14a7c6: /* PRO
4a50: 46 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37  F */....case 0x7
4a60: 61 62 33 38 31 63 36 3a 20 2f 2a 20 53 49 47 50  ab381c6: /* SIGP
4a70: 52 4f 46 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d  ROF */.....sig =
4a80: 20 53 49 47 50 52 4f 46 3b 0a 09 09 09 09 62 72   SIGPROF;.....br
4a90: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 37  eak;....case 0x7
4aa0: 39 33 33 61 33 34 38 3a 20 2f 2a 20 57 49 4e 43  933a348: /* WINC
4ab0: 48 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 32  H */....case 0x2
4ac0: 61 61 30 62 66 34 38 3a 20 2f 2a 20 53 49 47 57  aa0bf48: /* SIGW
4ad0: 49 4e 43 48 20 2a 2f 0a 09 09 09 09 73 69 67 20  INCH */.....sig 
4ae0: 3d 20 53 49 47 57 49 4e 43 48 3b 0a 09 09 09 09  = SIGWINCH;.....
4af0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
4b00: 78 32 34 63 66 3a 20 2f 2a 20 49 4f 20 2a 2f 0a  x24cf: /* IO */.
4b10: 09 09 09 63 61 73 65 20 30 78 33 39 33 31 65 36  ...case 0x3931e6
4b20: 34 66 3a 20 2f 2a 20 53 49 47 49 4f 20 2a 2f 0a  4f: /* SIGIO */.
4b30: 09 09 09 09 73 69 67 20 3d 20 53 49 47 49 4f 3b  ....sig = SIGIO;
4b40: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
4b50: 61 73 65 20 30 78 31 34 32 62 64 32 3a 20 2f 2a  ase 0x142bd2: /*
4b60: 20 50 57 52 20 2a 2f 0a 09 09 09 63 61 73 65 20   PWR */....case 
4b70: 30 78 39 38 66 35 36 35 64 32 3a 20 2f 2a 20 53  0x98f565d2: /* S
4b80: 49 47 50 57 52 20 2a 2f 0a 09 09 09 09 73 69 67  IGPWR */.....sig
4b90: 20 3d 20 53 49 47 50 57 52 3b 0a 09 09 09 09 62   = SIGPWR;.....b
4ba0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
4bb0: 31 34 65 63 64 33 3a 20 2f 2a 20 53 59 53 20 2a  14ecd3: /* SYS *
4bc0: 2f 0a 09 09 09 63 61 73 65 20 30 78 39 38 66 35  /....case 0x98f5
4bd0: 61 32 64 33 3a 20 2f 2a 20 53 49 47 53 59 53 20  a2d3: /* SIGSYS 
4be0: 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47  */.....sig = SIG
4bf0: 53 59 53 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  SYS;.....break;.
4c00: 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
4c10: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
4c20: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
4c30: 50 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20  Printf("unknown 
4c40: 73 69 67 6e 61 6c 20 5c 22 25 73 5c 22 22 2c 20  signal \"%s\"", 
4c50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 73 69  Tcl_GetString(si
4c60: 67 6e 61 6c 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09  gnal_obj)));....
4c70: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
4c80: 4f 52 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  OR);...}..} else
4c90: 20 7b 0a 09 09 73 69 67 20 3d 20 73 69 67 5f 77   {...sig = sig_w
4ca0: 69 64 65 3b 0a 09 7d 0a 0a 09 6b 69 6c 6c 5f 72  ide;..}...kill_r
4cb0: 65 74 20 3d 20 6b 69 6c 6c 28 70 69 64 2c 20 73  et = kill(pid, s
4cc0: 69 67 29 3b 0a 09 69 66 20 28 6b 69 6c 6c 5f 72  ig);..if (kill_r
4cd0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c  et != 0) {...Tcl
4ce0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
4cf0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
4d00: 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28  ingObj(strerror(
4d10: 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09  errno), -1));...
4d20: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
4d30: 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  R);..}...return(
4d40: 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74  TCL_OK);.}..stat
4d50: 69 63 20 69 6e 74 20 74 75 61 70 69 5f 72 65 62  ic int tuapi_reb
4d60: 6f 6f 74 28 43 6c 69 65 6e 74 44 61 74 61 20 63  oot(ClientData c
4d70: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
4d80: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
4d90: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
4da0: 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f 4f  objv[]) {..Tcl_O
4db0: 62 6a 20 2a 63 6d 64 5f 6f 62 6a 3b 0a 09 69 6e  bj *cmd_obj;..in
4dc0: 74 20 63 6d 64 3b 0a 09 69 6e 74 20 72 65 62 6f  t cmd;..int rebo
4dd0: 6f 74 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62  ot_ret;...if (ob
4de0: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 09 63 6d 64  jc == 2) {...cmd
4df0: 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a  _obj = objv[1];.
4e00: 0a 09 09 73 77 69 74 63 68 20 28 74 75 61 70 69  ...switch (tuapi
4e10: 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65  _internal_simple
4e20: 68 61 73 68 5f 6f 62 6a 28 63 6d 64 5f 6f 62 6a  hash_obj(cmd_obj
4e30: 29 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 32  )) {....case 0x2
4e40: 62 65 31 39 34 36 3a 20 2f 2a 20 4c 49 4e 55 58  be1946: /* LINUX
4e50: 5f 52 45 42 4f 4f 54 5f 43 4d 44 5f 43 41 44 5f  _REBOOT_CMD_CAD_
4e60: 4f 46 46 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  OFF */....case 0
4e70: 78 36 36 36 65 36 33 34 34 3a 20 2f 2a 20 52 42  x666e6344: /* RB
4e80: 5f 44 49 53 41 42 4c 45 5f 43 41 44 20 2a 2f 0a  _DISABLE_CAD */.
4e90: 09 09 09 63 61 73 65 20 30 78 39 65 33 63 65 36  ...case 0x9e3ce6
4ea0: 34 34 3a 20 2f 2a 20 44 49 53 41 42 4c 45 5f 43  44: /* DISABLE_C
4eb0: 41 44 20 2a 2f 0a 09 09 09 09 63 6d 64 20 3d 20  AD */.....cmd = 
4ec0: 52 42 5f 44 49 53 41 42 4c 45 5f 43 41 44 3b 0a  RB_DISABLE_CAD;.
4ed0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
4ee0: 61 73 65 20 30 78 65 38 30 35 37 63 34 65 3a 20  ase 0xe8057c4e: 
4ef0: 2f 2a 20 4c 49 4e 55 58 5f 52 45 42 4f 4f 54 5f  /* LINUX_REBOOT_
4f00: 43 4d 44 5f 43 41 44 5f 4f 4e 20 2a 2f 0a 09 09  CMD_CAD_ON */...
4f10: 09 63 61 73 65 20 30 78 66 38 64 63 34 34 34 3a  .case 0xf8dc444:
4f20: 20 2f 2a 20 52 42 5f 45 4e 41 42 4c 45 5f 43 41   /* RB_ENABLE_CA
4f30: 44 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 31  D */....case 0x1
4f40: 61 37 64 36 31 34 34 3a 20 2f 2a 20 45 4e 41 42  a7d6144: /* ENAB
4f50: 4c 45 5f 43 41 44 20 2a 2f 0a 09 09 09 09 63 6d  LE_CAD */.....cm
4f60: 64 20 3d 20 52 42 5f 45 4e 41 42 4c 45 5f 43 41  d = RB_ENABLE_CA
4f70: 44 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  D;......break;..
4f80: 09 09 63 61 73 65 20 30 78 39 35 62 66 61 34 35  ..case 0x95bfa45
4f90: 34 3a 20 2f 2a 20 4c 49 4e 55 58 5f 52 45 42 4f  4: /* LINUX_REBO
4fa0: 4f 54 5f 43 4d 44 5f 48 41 4c 54 20 2a 2f 0a 09  OT_CMD_HALT */..
4fb0: 09 09 63 61 73 65 20 30 78 33 32 31 30 64 61 34  ..case 0x3210da4
4fc0: 64 3a 20 2f 2a 20 52 42 5f 48 41 4c 54 5f 53 59  d: /* RB_HALT_SY
4fd0: 53 54 45 4d 20 2a 2f 0a 09 09 09 63 61 73 65 20  STEM */....case 
4fe0: 30 78 63 61 34 32 35 66 34 64 3a 20 2f 2a 20 48  0xca425f4d: /* H
4ff0: 41 4c 54 5f 53 59 53 54 45 4d 20 2a 2f 0a 09 09  ALT_SYSTEM */...
5000: 09 63 61 73 65 20 30 78 39 31 30 36 36 35 34 3a  .case 0x9106654:
5010: 20 2f 2a 20 48 41 4c 54 20 2a 2f 0a 09 09 09 09   /* HALT */.....
5020: 63 6d 64 20 3d 20 52 42 5f 48 41 4c 54 5f 53 59  cmd = RB_HALT_SY
5030: 53 54 45 4d 3b 0a 0a 09 09 09 09 62 72 65 61 6b  STEM;......break
5040: 3b 0a 09 09 09 63 61 73 65 20 30 78 64 62 35 35  ;....case 0xdb55
5050: 64 38 63 36 3a 20 2f 2a 20 4c 49 4e 55 58 5f 52  d8c6: /* LINUX_R
5060: 45 42 4f 4f 54 5f 43 4d 44 5f 50 4f 57 45 52 5f  EBOOT_CMD_POWER_
5070: 4f 46 46 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  OFF */....case 0
5080: 78 66 30 37 37 30 30 63 36 3a 20 2f 2a 20 52 42  xf07700c6: /* RB
5090: 5f 50 4f 57 45 52 5f 4f 46 46 20 2a 2f 0a 09 09  _POWER_OFF */...
50a0: 09 63 61 73 65 20 30 78 36 34 35 63 65 31 63 36  .case 0x645ce1c6
50b0: 3a 20 2f 2a 20 50 4f 57 45 52 5f 4f 46 46 20 2a  : /* POWER_OFF *
50c0: 2f 0a 09 09 09 09 63 6d 64 20 3d 20 30 78 34 33  /.....cmd = 0x43
50d0: 32 31 66 65 64 63 3b 0a 0a 09 09 09 09 62 72 65  21fedc;......bre
50e0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 37 33  ak;....case 0x73
50f0: 66 66 38 33 64 34 3a 20 2f 2a 20 4c 49 4e 55 58  ff83d4: /* LINUX
5100: 5f 52 45 42 4f 4f 54 5f 43 4d 44 5f 52 45 53 54  _REBOOT_CMD_REST
5110: 41 52 54 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  ART */....case 0
5120: 78 33 63 64 30 65 32 35 34 3a 20 2f 2a 20 52 42  x3cd0e254: /* RB
5130: 5f 41 55 54 4f 42 4f 4f 54 20 2a 2f 0a 09 09 09  _AUTOBOOT */....
5140: 63 61 73 65 20 30 78 62 39 66 38 62 35 64 34 3a  case 0xb9f8b5d4:
5150: 20 2f 2a 20 41 55 54 4f 42 4f 4f 54 20 2a 2f 0a   /* AUTOBOOT */.
5160: 09 09 09 63 61 73 65 20 30 78 33 61 33 35 37 66  ...case 0x3a357f
5170: 64 34 3a 20 2f 2a 20 52 45 53 54 41 52 54 20 2a  d4: /* RESTART *
5180: 2f 0a 09 09 09 63 61 73 65 20 30 78 35 38 35 32  /....case 0x5852
5190: 61 64 64 34 3a 20 2f 2a 20 52 45 42 4f 4f 54 20  add4: /* REBOOT 
51a0: 2a 2f 0a 09 09 09 09 63 6d 64 20 3d 20 52 42 5f  */.....cmd = RB_
51b0: 41 55 54 4f 42 4f 4f 54 3b 0a 0a 09 09 09 09 62  AUTOBOOT;......b
51c0: 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74  reak;....default
51d0: 3a 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a  :.....Tcl_SetObj
51e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
51f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5200: 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 61 6d 62 69  "unknown or ambi
5210: 67 75 6f 75 73 20 73 75 62 63 6f 6d 6d 61 6e 64  guous subcommand
5220: 3a 20 6d 75 73 74 20 62 65 20 44 49 53 41 42 4c  : must be DISABL
5230: 45 5f 43 41 44 2c 20 45 4e 41 42 4c 45 5f 43 41  E_CAD, ENABLE_CA
5240: 44 2c 20 48 41 4c 54 2c 20 50 4f 57 45 52 5f 4f  D, HALT, POWER_O
5250: 46 46 2c 20 6f 72 20 52 45 53 54 41 52 54 22 2c  FF, or RESTART",
5260: 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72 65 74 75   -1));......retu
5270: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
5280: 09 7d 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6f  .}..} else if (o
5290: 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 09 63 6d  bjc == 1) {...cm
52a0: 64 20 3d 20 52 42 5f 41 55 54 4f 42 4f 4f 54 3b  d = RB_AUTOBOOT;
52b0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 54 63 6c  ..} else {...Tcl
52c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
52d0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
52e0: 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20  ingObj("wrong # 
52f0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
5300: 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61  \"::tuapi::sysca
5310: 6c 6c 3a 3a 72 65 62 6f 6f 74 20 3f 63 6f 6d 6d  ll::reboot ?comm
5320: 61 6e 64 3f 22 2c 20 2d 31 29 29 3b 0a 0a 09 09  and?", -1));....
5330: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
5340: 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
5350: 63 6d 64 29 20 7b 0a 09 09 63 61 73 65 20 52 42  cmd) {...case RB
5360: 5f 45 4e 41 42 4c 45 5f 43 41 44 3a 0a 09 09 63  _ENABLE_CAD:...c
5370: 61 73 65 20 52 42 5f 44 49 53 41 42 4c 45 5f 43  ase RB_DISABLE_C
5380: 41 44 3a 0a 09 09 09 2f 2a 20 4e 6f 20 6e 65 65  AD:..../* No nee
5390: 64 20 74 6f 20 73 79 6e 63 20 66 6f 72 20 74 68  d to sync for th
53a0: 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ese operations *
53b0: 2f 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  /....break;...de
53c0: 66 61 75 6c 74 3a 0a 09 09 09 73 79 6e 63 28 29  fault:....sync()
53d0: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
53e0: 09 72 65 62 6f 6f 74 5f 72 65 74 20 3d 20 72 65  .reboot_ret = re
53f0: 62 6f 6f 74 28 63 6d 64 29 3b 0a 09 69 66 20 28  boot(cmd);..if (
5400: 72 65 62 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29  reboot_ret != 0)
5410: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
5420: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
5430: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
5440: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20  trerror(errno), 
5450: 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  -1));....return(
5460: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  TCL_ERROR);..}..
5470: 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
5480: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
5490: 75 61 70 69 5f 65 6a 65 63 74 28 43 6c 69 65 6e  uapi_eject(Clien
54a0: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
54b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
54c0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
54d0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
54e0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
54f0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
5500: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74  ewStringObj("not
5510: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d   implemented", -
5520: 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43  1));...return(TC
5530: 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61  L_ERROR);.}..sta
5540: 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 70 73  tic int tuapi_ps
5550: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20  (ClientData cd, 
5560: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5570: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
5580: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
5590: 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f  v[]) {..Tcl_SetO
55a0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
55b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
55c0: 6a 28 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  j("not implement
55d0: 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74  ed", -1));...ret
55e0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
55f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
5600: 61 70 69 5f 65 78 65 63 76 65 28 43 6c 69 65 6e  api_execve(Clien
5610: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
5620: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
5630: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
5640: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
5650: 0a 09 63 68 61 72 20 2a 2a 61 72 67 76 20 3d 20  ..char **argv = 
5660: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 66 69 6c  NULL;..char *fil
5670: 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 69  e;..int idx;...i
5680: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
5690: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
56a0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
56b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e  wStringObj("wron
56c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
56d0: 20 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73   be \"::tuapi::s
56e0: 79 73 63 61 6c 6c 3a 3a 65 78 65 63 76 65 20 66  yscall::execve f
56f0: 69 6c 65 20 3f 61 72 67 73 20 2e 2e 2e 3f 5c 22  ile ?args ...?\"
5700: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75  ", -1));....retu
5710: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
5720: 7d 0a 0a 09 2f 2a 20 46 69 6e 64 20 65 78 65 63  }.../* Find exec
5730: 75 74 61 62 6c 65 20 2a 2f 0a 09 66 69 6c 65 20  utable */..file 
5740: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
5750: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 09 2f 2a 20 47  objv[1]);.../* G
5760: 65 6e 65 72 61 74 65 20 61 72 67 75 6d 65 6e 74  enerate argument
5770: 20 61 72 72 61 79 20 2a 2f 0a 09 61 72 67 76 20   array */..argv 
5780: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
5790: 2a 61 72 67 76 29 20 2a 20 28 6f 62 6a 63 20 2d  *argv) * (objc -
57a0: 20 31 29 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78   1));...for (idx
57b0: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
57c0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 61 72 67  ; idx++) {...arg
57d0: 76 5b 69 64 78 20 2d 20 32 5d 20 3d 20 54 63 6c  v[idx - 2] = Tcl
57e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
57f0: 69 64 78 5d 29 3b 0a 09 7d 0a 09 61 72 67 76 5b  idx]);..}..argv[
5800: 6f 62 6a 63 20 2d 20 32 5d 20 3d 20 4e 55 4c 4c  objc - 2] = NULL
5810: 3b 0a 0a 09 2f 2a 20 50 61 73 73 20 65 78 65 63  ;.../* Pass exec
5820: 75 74 69 6f 6e 20 74 6f 20 6e 65 77 20 66 69 6c  ution to new fil
5830: 65 20 2a 2f 0a 09 65 78 65 63 76 65 28 66 69 6c  e */..execve(fil
5840: 65 2c 20 61 72 67 76 2c 20 65 6e 76 69 72 6f 6e  e, argv, environ
5850: 29 3b 0a 0a 09 2f 2a 20 49 66 20 74 68 65 20 6e  );.../* If the n
5860: 65 77 20 69 6d 61 67 65 20 63 6f 75 6c 64 20 6e  ew image could n
5870: 6f 74 20 74 61 6b 65 20 6f 76 65 72 2c 20 73 6f  ot take over, so
5880: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f  mething went wro
5890: 6e 67 20 2d 2d 20 72 65 70 6f 72 74 20 65 72 72  ng -- report err
58a0: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 53 65 74 4f 62  or */..Tcl_SetOb
58b0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
58c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
58d0: 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29  (strerror(errno)
58e0: 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e  , -1));...return
58f0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a  (TCL_ERROR);.}..
5900: 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69  static int tuapi
5910: 5f 6c 6f 73 65 74 75 70 28 43 6c 69 65 6e 74 44  _losetup(ClientD
5920: 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65  ata cd, Tcl_Inte
5930: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
5940: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43  objc, Tcl_Obj *C
5950: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09  ONST objv[]) {..
5960: 63 68 61 72 20 2a 66 69 6c 65 2c 20 2a 6c 6f 6f  char *file, *loo
5970: 70 64 65 76 3b 0a 09 69 6e 74 20 63 68 6b 5f 72  pdev;..int chk_r
5980: 65 74 3b 0a 09 69 6e 74 20 6c 6f 6f 70 66 64 2c  et;..int loopfd,
5990: 20 66 69 6c 65 66 64 3b 0a 0a 09 69 66 20 28 6f   filefd;...if (o
59a0: 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 09 54 63  bjc != 3) {...Tc
59b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
59c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
59d0: 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23  ringObj("wrong #
59e0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
59f0: 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63   \"::tuapi::sysc
5a00: 61 6c 6c 3a 3a 6c 6f 73 65 74 75 70 20 6c 6f 6f  all::losetup loo
5a10: 70 64 65 76 20 66 69 6c 65 5c 22 22 2c 20 2d 31  pdev file\"", -1
5a20: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  ));....return(TC
5a30: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c  L_ERROR);..}...l
5a40: 6f 6f 70 64 65 76 20 3d 20 54 63 6c 5f 47 65 74  oopdev = Tcl_Get
5a50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
5a60: 0a 09 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  ..file = Tcl_Get
5a70: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
5a80: 0a 0a 09 6c 6f 6f 70 66 64 20 3d 20 6f 70 65 6e  ...loopfd = open
5a90: 28 6c 6f 6f 70 64 65 76 2c 20 4f 5f 52 44 4f 4e  (loopdev, O_RDON
5aa0: 4c 59 29 3b 0a 09 69 66 20 28 6c 6f 6f 70 66 64  LY);..if (loopfd
5ab0: 20 3c 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65   < 0) {...Tcl_Se
5ac0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5ad0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
5ae0: 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72  Obj(strerror(err
5af0: 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  no), -1));....re
5b00: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
5b10: 0a 09 7d 0a 0a 09 69 66 20 28 66 69 6c 65 5b 30  ..}...if (file[0
5b20: 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09 09 66  ] != '\0') {...f
5b30: 69 6c 65 66 64 20 3d 20 6f 70 65 6e 28 66 69 6c  ilefd = open(fil
5b40: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 09  e, O_RDONLY);...
5b50: 69 66 20 28 66 69 6c 65 66 64 20 3c 20 30 29 20  if (filefd < 0) 
5b60: 7b 0a 09 09 09 63 6c 6f 73 65 28 6c 6f 6f 70 66  {....close(loopf
5b70: 64 29 3b 0a 0a 09 09 09 54 63 6c 5f 53 65 74 4f  d);.....Tcl_SetO
5b80: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
5b90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5ba0: 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  j(strerror(errno
5bb0: 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74  ), -1));.....ret
5bc0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
5bd0: 09 09 7d 0a 0a 09 09 63 68 6b 5f 72 65 74 20 3d  ..}....chk_ret =
5be0: 20 69 6f 63 74 6c 28 6c 6f 6f 70 66 64 2c 20 4c   ioctl(loopfd, L
5bf0: 4f 4f 50 5f 53 45 54 5f 46 44 2c 20 66 69 6c 65  OOP_SET_FD, file
5c00: 66 64 29 3b 0a 0a 09 09 63 6c 6f 73 65 28 66 69  fd);....close(fi
5c10: 6c 65 66 64 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  lefd);..} else {
5c20: 0a 09 09 63 68 6b 5f 72 65 74 20 3d 20 69 6f 63  ...chk_ret = ioc
5c30: 74 6c 28 6c 6f 6f 70 66 64 2c 20 4c 4f 4f 50 5f  tl(loopfd, LOOP_
5c40: 43 4c 52 5f 46 44 2c 20 30 29 3b 0a 09 7d 0a 0a  CLR_FD, 0);..}..
5c50: 09 63 6c 6f 73 65 28 6c 6f 6f 70 66 64 29 3b 0a  .close(loopfd);.
5c60: 0a 09 69 66 20 28 63 68 6b 5f 72 65 74 20 21 3d  ..if (chk_ret !=
5c70: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f   0) {...Tcl_SetO
5c80: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
5c90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5ca0: 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  j(strerror(errno
5cb0: 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75  ), -1));....retu
5cc0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
5cd0: 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f  }...return(TCL_O
5ce0: 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  K);.}..static vo
5cf0: 69 64 20 74 75 61 70 69 5f 70 72 69 76 61 74 65  id tuapi_private
5d00: 5f 61 70 70 65 6e 64 5f 73 6f 63 6b 61 64 64 72  _append_sockaddr
5d10: 5f 74 6f 5f 74 63 6c 6f 62 6a 28 54 63 6c 5f 49  _to_tclobj(Tcl_I
5d20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
5d30: 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 2c 20 63 68  cl_Obj *list, ch
5d40: 61 72 20 2a 68 65 61 64 65 72 2c 20 73 74 72 75  ar *header, stru
5d50: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64  ct sockaddr *add
5d60: 72 29 20 7b 0a 09 63 68 61 72 20 61 64 64 72 5f  r) {..char addr_
5d70: 62 75 66 5b 49 4e 45 54 36 5f 41 44 44 52 53 54  buf[INET6_ADDRST
5d80: 52 4c 45 4e 20 2b 20 49 4e 45 54 5f 41 44 44 52  RLEN + INET_ADDR
5d90: 53 54 52 4c 45 4e 20 2b 20 31 5d 2c 20 2a 63 68  STRLEN + 1], *ch
5da0: 6b 5f 69 6e 70 3b 0a 0a 09 73 77 69 74 63 68 20  k_inp;...switch 
5db0: 28 61 64 64 72 2d 3e 73 61 5f 66 61 6d 69 6c 79  (addr->sa_family
5dc0: 29 20 7b 0a 09 09 63 61 73 65 20 41 46 5f 49 4e  ) {...case AF_IN
5dd0: 45 54 3a 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 09  ET: /* IPv4 */..
5de0: 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36 3a 20  .case AF_INET6: 
5df0: 2f 2a 20 49 50 76 36 20 2a 2f 0a 09 09 09 73 77  /* IPv6 */....sw
5e00: 69 74 63 68 20 28 61 64 64 72 2d 3e 73 61 5f 66  itch (addr->sa_f
5e10: 61 6d 69 6c 79 29 20 7b 0a 09 09 09 09 63 61 73  amily) {.....cas
5e20: 65 20 41 46 5f 49 4e 45 54 3a 20 2f 2a 20 49 50  e AF_INET: /* IP
5e30: 76 34 20 2a 2f 0a 09 09 09 09 09 63 68 6b 5f 69  v4 */......chk_i
5e40: 6e 70 20 3d 20 28 63 68 61 72 20 2a 29 20 69 6e  np = (char *) in
5e50: 65 74 5f 6e 74 6f 70 28 61 64 64 72 2d 3e 73 61  et_ntop(addr->sa
5e60: 5f 66 61 6d 69 6c 79 2c 20 26 28 28 73 74 72 75  _family, &((stru
5e70: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a  ct sockaddr_in *
5e80: 29 20 61 64 64 72 29 2d 3e 73 69 6e 5f 61 64 64  ) addr)->sin_add
5e90: 72 2c 20 61 64 64 72 5f 62 75 66 2c 20 73 69 7a  r, addr_buf, siz
5ea0: 65 6f 66 28 61 64 64 72 5f 62 75 66 29 29 3b 0a  eof(addr_buf));.
5eb0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
5ec0: 63 61 73 65 20 41 46 5f 49 4e 45 54 36 3a 20 2f  case AF_INET6: /
5ed0: 2a 20 49 50 76 36 20 2a 2f 0a 09 09 09 09 09 63  * IPv6 */......c
5ee0: 68 6b 5f 69 6e 70 20 3d 20 28 63 68 61 72 20 2a  hk_inp = (char *
5ef0: 29 20 69 6e 65 74 5f 6e 74 6f 70 28 61 64 64 72  ) inet_ntop(addr
5f00: 2d 3e 73 61 5f 66 61 6d 69 6c 79 2c 20 26 28 28  ->sa_family, &((
5f10: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
5f20: 69 6e 36 20 2a 29 20 61 64 64 72 29 2d 3e 73 69  in6 *) addr)->si
5f30: 6e 36 5f 61 64 64 72 2c 20 61 64 64 72 5f 62 75  n6_addr, addr_bu
5f40: 66 2c 20 73 69 7a 65 6f 66 28 61 64 64 72 5f 62  f, sizeof(addr_b
5f50: 75 66 29 29 3b 0a 09 09 09 09 09 62 72 65 61 6b  uf));......break
5f60: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63  ;....}.....if (c
5f70: 68 6b 5f 69 6e 70 20 3d 3d 20 4e 55 4c 4c 29 20  hk_inp == NULL) 
5f80: 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
5f90: 7d 0a 0a 09 09 09 69 66 20 28 68 65 61 64 65 72  }.....if (header
5fa0: 29 20 7b 0a 09 09 09 09 54 63 6c 5f 4c 69 73 74  ) {.....Tcl_List
5fb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5fc0: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 2c 20 54  (interp, list, T
5fd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5fe0: 68 65 61 64 65 72 2c 20 2d 31 29 29 3b 0a 09 09  header, -1));...
5ff0: 09 7d 0a 0a 09 09 09 54 63 6c 5f 4c 69 73 74 4f  .}.....Tcl_ListO
6000: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6010: 69 6e 74 65 72 70 2c 20 6c 69 73 74 2c 20 54 63  interp, list, Tc
6020: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61  l_NewStringObj(a
6030: 64 64 72 5f 62 75 66 2c 20 2d 31 29 29 3b 0a 0a  ddr_buf, -1));..
6040: 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
6050: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
6060: 20 69 6e 74 20 74 75 61 70 69 5f 70 72 69 76 61   int tuapi_priva
6070: 74 65 5f 67 65 74 5f 73 6f 63 6b 61 64 64 72 5f  te_get_sockaddr_
6080: 66 72 6f 6d 5f 6f 62 6a 28 54 63 6c 5f 4f 62 6a  from_obj(Tcl_Obj
6090: 20 2a 76 61 6c 75 65 2c 20 76 6f 69 64 20 2a 74   *value, void *t
60a0: 61 72 67 65 74 29 20 7b 0a 09 73 74 72 75 63 74  arget) {..struct
60b0: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 6c 6f 63   sockaddr_in loc
60c0: 61 6c 5f 76 34 3b 0a 09 73 74 72 75 63 74 20 73  al_v4;..struct s
60d0: 6f 63 6b 61 64 64 72 5f 69 6e 36 20 6c 6f 63 61  ockaddr_in6 loca
60e0: 6c 5f 76 36 3b 0a 09 63 6f 6e 73 74 20 63 68 61  l_v6;..const cha
60f0: 72 20 2a 61 64 64 72 5f 73 74 72 3b 0a 09 69 6e  r *addr_str;..in
6100: 74 20 69 6e 65 74 70 74 6f 6e 5f 72 65 74 3b 0a  t inetpton_ret;.
6110: 0a 09 61 64 64 72 5f 73 74 72 20 3d 20 54 63 6c  ..addr_str = Tcl
6120: 5f 47 65 74 53 74 72 69 6e 67 28 76 61 6c 75 65  _GetString(value
6130: 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 26 6c 6f 63  );...memset(&loc
6140: 61 6c 5f 76 34 2c 20 30 2c 20 73 69 7a 65 6f 66  al_v4, 0, sizeof
6150: 28 6c 6f 63 61 6c 5f 76 34 29 29 3b 0a 09 69 6e  (local_v4));..in
6160: 65 74 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65  etpton_ret = ine
6170: 74 5f 70 74 6f 6e 28 41 46 5f 49 4e 45 54 2c 20  t_pton(AF_INET, 
6180: 61 64 64 72 5f 73 74 72 2c 20 26 6c 6f 63 61 6c  addr_str, &local
6190: 5f 76 34 2e 73 69 6e 5f 61 64 64 72 29 3b 0a 09  _v4.sin_addr);..
61a0: 69 66 20 28 69 6e 65 74 70 74 6f 6e 5f 72 65 74  if (inetpton_ret
61b0: 20 3d 3d 20 31 29 20 7b 0a 09 09 6c 6f 63 61 6c   == 1) {...local
61c0: 5f 76 34 2e 73 69 6e 5f 66 61 6d 69 6c 79 20 3d  _v4.sin_family =
61d0: 20 41 46 5f 49 4e 45 54 3b 0a 0a 09 09 6d 65 6d   AF_INET;....mem
61e0: 63 70 79 28 74 61 72 67 65 74 2c 20 26 6c 6f 63  cpy(target, &loc
61f0: 61 6c 5f 76 34 2c 20 73 69 7a 65 6f 66 28 6c 6f  al_v4, sizeof(lo
6200: 63 61 6c 5f 76 34 29 29 3b 0a 0a 09 09 72 65 74  cal_v4));....ret
6210: 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 6d 65 6d  urn(0);..}...mem
6220: 73 65 74 28 26 6c 6f 63 61 6c 5f 76 36 2c 20 30  set(&local_v6, 0
6230: 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 61 6c 5f 76  , sizeof(local_v
6240: 36 29 29 3b 0a 09 69 6e 65 74 70 74 6f 6e 5f 72  6));..inetpton_r
6250: 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 41  et = inet_pton(A
6260: 46 5f 49 4e 45 54 36 2c 20 61 64 64 72 5f 73 74  F_INET6, addr_st
6270: 72 2c 20 26 6c 6f 63 61 6c 5f 76 36 2e 73 69 6e  r, &local_v6.sin
6280: 36 5f 61 64 64 72 29 3b 0a 09 69 66 20 28 69 6e  6_addr);..if (in
6290: 65 74 70 74 6f 6e 5f 72 65 74 20 3d 3d 20 31 29  etpton_ret == 1)
62a0: 20 7b 0a 09 09 6c 6f 63 61 6c 5f 76 36 2e 73 69   {...local_v6.si
62b0: 6e 36 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49  n6_family = AF_I
62c0: 4e 45 54 36 3b 0a 0a 09 09 6d 65 6d 63 70 79 28  NET6;....memcpy(
62d0: 74 61 72 67 65 74 2c 20 26 6c 6f 63 61 6c 5f 76  target, &local_v
62e0: 36 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 61 6c 5f  6, sizeof(local_
62f0: 76 36 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  v6));....return(
6300: 30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  0);..}...return(
6310: 2d 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  -1);.}..static i
6320: 6e 74 20 74 75 61 70 69 5f 69 66 63 6f 6e 66 69  nt tuapi_ifconfi
6330: 67 5f 6c 69 73 74 28 43 6c 69 65 6e 74 44 61 74  g_list(ClientDat
6340: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  a cd, Tcl_Interp
6350: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
6360: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  jc, Tcl_Obj *CON
6370: 53 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73  ST objv[], int s
6380: 6f 63 6b 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  ock) {..Tcl_Obj 
6390: 2a 74 63 6c 5f 69 66 61 63 65 5f 6c 69 73 74 3b  *tcl_iface_list;
63a0: 0a 09 73 74 72 75 63 74 20 69 66 63 6f 6e 66 20  ..struct ifconf 
63b0: 69 66 61 63 65 73 5f 63 66 67 3b 0a 09 73 74 72  ifaces_cfg;..str
63c0: 75 63 74 20 69 66 72 65 71 20 2a 69 66 61 63 65  uct ifreq *iface
63d0: 5f 72 65 71 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e  _req = NULL;..in
63e0: 74 20 69 66 61 63 65 5f 72 65 71 5f 63 6e 74 20  t iface_req_cnt 
63f0: 3d 20 32 32 34 2c 20 69 66 61 63 65 5f 72 65 71  = 224, iface_req
6400: 5f 6c 65 6e 3b 0a 09 69 6e 74 20 69 64 78 2c 20  _len;..int idx, 
6410: 69 66 61 63 65 5f 63 6e 74 3b 0a 09 69 6e 74 20  iface_cnt;..int 
6420: 69 6f 63 74 6c 5f 72 65 74 2c 20 74 63 6c 5f 72  ioctl_ret, tcl_r
6430: 65 74 3b 0a 0a 09 69 66 61 63 65 5f 72 65 71 5f  et;...iface_req_
6440: 6c 65 6e 20 3d 20 69 66 61 63 65 5f 72 65 71 5f  len = iface_req_
6450: 63 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 69 66  cnt * sizeof(*if
6460: 61 63 65 5f 72 65 71 29 3b 0a 09 69 66 61 63 65  ace_req);..iface
6470: 5f 72 65 71 20 3d 20 6d 61 6c 6c 6f 63 28 69 66  _req = malloc(if
6480: 61 63 65 5f 72 65 71 5f 6c 65 6e 29 3b 0a 09 69  ace_req_len);..i
6490: 66 20 28 69 66 61 63 65 5f 72 65 71 20 3d 3d 20  f (iface_req == 
64a0: 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 52 65 70  NULL) {.../* Rep
64b0: 6f 72 74 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09  ort failure */..
64c0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
64d0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
64e0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62  wStringObj("unab
64f0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
6500: 65 6d 6f 72 79 22 2c 20 2d 31 29 29 3b 0a 0a 09  emory", -1));...
6510: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
6520: 52 29 3b 0a 09 7d 0a 0a 09 69 66 61 63 65 73 5f  R);..}...ifaces_
6530: 63 66 67 2e 69 66 63 5f 72 65 71 20 3d 20 69 66  cfg.ifc_req = if
6540: 61 63 65 5f 72 65 71 3b 0a 09 69 66 61 63 65 73  ace_req;..ifaces
6550: 5f 63 66 67 2e 69 66 63 5f 6c 65 6e 20 3d 20 69  _cfg.ifc_len = i
6560: 66 61 63 65 5f 72 65 71 5f 6c 65 6e 3b 0a 09 69  face_req_len;..i
6570: 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c  octl_ret = ioctl
6580: 28 73 6f 63 6b 2c 20 53 49 4f 43 47 49 46 43 4f  (sock, SIOCGIFCO
6590: 4e 46 2c 20 26 69 66 61 63 65 73 5f 63 66 67 29  NF, &ifaces_cfg)
65a0: 3b 0a 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74  ;..if (ioctl_ret
65b0: 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53   != 0) {...Tcl_S
65c0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
65d0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
65e0: 67 4f 62 6a 28 22 69 6f 63 74 6c 20 66 61 69 6c  gObj("ioctl fail
65f0: 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 66 72  ed", -1));....fr
6600: 65 65 28 69 66 61 63 65 5f 72 65 71 29 3b 0a 0a  ee(iface_req);..
6610: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
6620: 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 61 63 65 5f  OR);..}...iface_
6630: 63 6e 74 20 3d 20 69 66 61 63 65 73 5f 63 66 67  cnt = ifaces_cfg
6640: 2e 69 66 63 5f 6c 65 6e 20 2f 20 73 69 7a 65 6f  .ifc_len / sizeo
6650: 66 28 2a 69 66 61 63 65 5f 72 65 71 29 3b 0a 0a  f(*iface_req);..
6660: 09 74 63 6c 5f 69 66 61 63 65 5f 6c 69 73 74 20  .tcl_iface_list 
6670: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
6680: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
6690: 69 64 78 20 3c 20 69 66 61 63 65 5f 63 6e 74 3b  idx < iface_cnt;
66a0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 74 63 6c 5f   idx++) {...tcl_
66b0: 72 65 74 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62  ret = Tcl_ListOb
66c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
66d0: 6e 74 65 72 70 2c 20 74 63 6c 5f 69 66 61 63 65  nterp, tcl_iface
66e0: 5f 6c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74  _list, Tcl_NewSt
66f0: 72 69 6e 67 4f 62 6a 28 69 66 61 63 65 5f 72 65  ringObj(iface_re
6700: 71 5b 69 64 78 5d 2e 69 66 72 5f 6e 61 6d 65 2c  q[idx].ifr_name,
6710: 20 2d 31 29 29 3b 0a 09 09 69 66 20 28 74 63 6c   -1));...if (tcl
6720: 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  _ret != TCL_OK) 
6730: 7b 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52  {....Tcl_SetObjR
6740: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
6750: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6760: 75 6e 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64  unable to append
6770: 20 74 6f 20 6c 69 73 74 22 2c 20 2d 31 29 29 3b   to list", -1));
6780: 0a 0a 09 09 09 66 72 65 65 28 69 66 61 63 65 5f  .....free(iface_
6790: 72 65 71 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  req);.....return
67a0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  (TCL_ERROR);...}
67b0: 0a 09 7d 0a 0a 09 66 72 65 65 28 69 66 61 63 65  ..}...free(iface
67c0: 5f 72 65 71 29 3b 0a 0a 09 54 63 6c 5f 53 65 74  _req);...Tcl_Set
67d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
67e0: 2c 20 74 63 6c 5f 69 66 61 63 65 5f 6c 69 73 74  , tcl_iface_list
67f0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  );...return(TCL_
6800: 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OK);.}..static i
6810: 6e 74 20 74 75 61 70 69 5f 69 66 63 6f 6e 66 69  nt tuapi_ifconfi
6820: 67 5f 69 6e 66 6f 28 43 6c 69 65 6e 74 44 61 74  g_info(ClientDat
6830: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  a cd, Tcl_Interp
6840: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
6850: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  jc, Tcl_Obj *CON
6860: 53 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73  ST objv[], int s
6870: 6f 63 6b 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 34  ock, int sock_v4
6880: 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 36 29 20 7b  , int sock_v6) {
6890: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 6c 69  ..Tcl_Obj *retli
68a0: 73 74 2c 20 2a 66 6c 61 67 73 3b 0a 09 73 74 72  st, *flags;..str
68b0: 75 63 74 20 69 66 72 65 71 20 69 66 61 63 65 5f  uct ifreq iface_
68c0: 72 65 71 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  req;..unsigned c
68d0: 68 61 72 20 2a 61 64 64 72 5f 64 61 74 61 3b 0a  har *addr_data;.
68e0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e  .const char *lin
68f0: 6b 5f 65 6e 63 61 70 3b 0a 09 63 6f 6e 73 74 20  k_encap;..const 
6900: 63 68 61 72 20 2a 69 66 61 63 65 3b 0a 09 69 6e  char *iface;..in
6910: 74 20 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 2c  t flags_bitmask,
6920: 20 66 6c 61 67 5f 62 72 6f 61 64 63 61 73 74 20   flag_broadcast 
6930: 3d 20 30 2c 20 66 6c 61 67 5f 70 6f 69 6e 74 6f  = 0, flag_pointo
6940: 70 6f 69 6e 74 20 3d 20 30 3b 0a 09 69 6e 74 20  point = 0;..int 
6950: 69 6f 63 74 6c 5f 72 65 74 3b 0a 0a 09 72 65 74  ioctl_ret;...ret
6960: 6c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  list = Tcl_NewOb
6970: 6a 28 29 3b 0a 0a 09 69 66 61 63 65 20 3d 20 54  j();...iface = T
6980: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
6990: 76 5b 31 5d 29 3b 0a 0a 09 69 66 20 28 28 73 74  v[1]);...if ((st
69a0: 72 6c 65 6e 28 69 66 61 63 65 29 20 2b 20 31 29  rlen(iface) + 1)
69b0: 20 3e 3d 20 49 46 4e 41 4d 53 49 5a 29 20 7b 0a   >= IFNAMSIZ) {.
69c0: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
69d0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
69e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 74  ewStringObj("int
69f0: 65 72 66 61 63 65 20 6e 61 6d 65 20 74 6f 6f 20  erface name too 
6a00: 6c 6f 6e 67 22 2c 20 2d 31 29 29 3b 0a 0a 09 09  long", -1));....
6a10: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
6a20: 29 3b 0a 09 7d 0a 0a 09 73 74 72 63 70 79 28 69  );..}...strcpy(i
6a30: 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 6e 61 6d  face_req.ifr_nam
6a40: 65 2c 20 69 66 61 63 65 29 3b 0a 0a 09 2f 2a 0a  e, iface);.../*.
6a50: 09 20 2a 20 41 6c 6c 20 69 6e 74 65 72 66 61 63  . * All interfac
6a60: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66  es should have f
6a70: 6c 61 67 73 2c 20 73 6f 20 75 73 65 20 69 74 20  lags, so use it 
6a80: 61 73 20 61 20 63 68 65 63 6b 20 66 6f 72 20 69  as a check for i
6a90: 6e 74 65 72 66 61 63 65 0a 09 20 2a 20 65 78 69  nterface.. * exi
6aa0: 73 74 61 6e 63 65 0a 09 20 2a 2f 0a 09 69 6f 63  stance.. */..ioc
6ab0: 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73  tl_ret = ioctl(s
6ac0: 6f 63 6b 2c 20 53 49 4f 43 47 49 46 46 4c 41 47  ock, SIOCGIFFLAG
6ad0: 53 2c 20 26 69 66 61 63 65 5f 72 65 71 29 3b 0a  S, &iface_req);.
6ae0: 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 21  .if (ioctl_ret !
6af0: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  = 0) {...Tcl_Set
6b00: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
6b10: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6b20: 62 6a 28 22 69 6e 76 61 6c 69 64 20 69 6e 74 65  bj("invalid inte
6b30: 72 66 61 63 65 22 2c 20 2d 31 29 29 3b 0a 0a 09  rface", -1));...
6b40: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
6b50: 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  R);..}.../* Crea
6b60: 74 65 20 6c 69 73 74 20 6f 66 20 66 6c 61 67 73  te list of flags
6b70: 20 2a 2f 0a 09 66 6c 61 67 73 20 3d 20 54 63 6c   */..flags = Tcl
6b80: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 66 6c 61 67  _NewObj();..flag
6b90: 73 5f 62 69 74 6d 61 73 6b 20 3d 20 69 66 61 63  s_bitmask = ifac
6ba0: 65 5f 72 65 71 2e 69 66 72 5f 66 6c 61 67 73 3b  e_req.ifr_flags;
6bb0: 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69  ...if ((flags_bi
6bc0: 74 6d 61 73 6b 20 26 20 49 46 46 5f 55 50 29 20  tmask & IFF_UP) 
6bd0: 3d 3d 20 49 46 46 5f 55 50 29 20 7b 0a 09 09 54  == IFF_UP) {...T
6be0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6bf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6c00: 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74  flags, Tcl_NewSt
6c10: 72 69 6e 67 4f 62 6a 28 22 55 50 22 2c 20 2d 31  ringObj("UP", -1
6c20: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61  ));..}..if ((fla
6c30: 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46  gs_bitmask & IFF
6c40: 5f 42 52 4f 41 44 43 41 53 54 29 20 3d 3d 20 49  _BROADCAST) == I
6c50: 46 46 5f 42 52 4f 41 44 43 41 53 54 29 20 7b 0a  FF_BROADCAST) {.
6c60: 09 09 66 6c 61 67 5f 62 72 6f 61 64 63 61 73 74  ..flag_broadcast
6c70: 20 3d 20 31 3b 0a 0a 09 09 54 63 6c 5f 4c 69 73   = 1;....Tcl_Lis
6c80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6c90: 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c  t(interp, flags,
6ca0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6cb0: 6a 28 22 42 52 4f 41 44 43 41 53 54 22 2c 20 2d  j("BROADCAST", -
6cc0: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c  1));..}..if ((fl
6cd0: 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46  ags_bitmask & IF
6ce0: 46 5f 50 4f 49 4e 54 4f 50 4f 49 4e 54 29 20 3d  F_POINTOPOINT) =
6cf0: 3d 20 49 46 46 5f 50 4f 49 4e 54 4f 50 4f 49 4e  = IFF_POINTOPOIN
6d00: 54 29 20 7b 0a 09 09 66 6c 61 67 5f 70 6f 69 6e  T) {...flag_poin
6d10: 74 6f 70 6f 69 6e 74 20 3d 20 31 3b 0a 0a 09 09  topoint = 1;....
6d20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6d30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6d40: 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53   flags, Tcl_NewS
6d50: 74 72 69 6e 67 4f 62 6a 28 22 50 4f 49 4e 54 4f  tringObj("POINTO
6d60: 50 4f 49 4e 54 22 2c 20 2d 31 29 29 3b 0a 09 7d  POINT", -1));..}
6d70: 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74  ..if ((flags_bit
6d80: 6d 61 73 6b 20 26 20 49 46 46 5f 44 45 42 55 47  mask & IFF_DEBUG
6d90: 29 20 3d 3d 20 49 46 46 5f 44 45 42 55 47 29 20  ) == IFF_DEBUG) 
6da0: 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  {...Tcl_ListObjA
6db0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6dc0: 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f  erp, flags, Tcl_
6dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 45  NewStringObj("DE
6de0: 42 55 47 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  BUG", -1));..}..
6df0: 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61  if ((flags_bitma
6e00: 73 6b 20 26 20 49 46 46 5f 4c 4f 4f 50 42 41 43  sk & IFF_LOOPBAC
6e10: 4b 29 20 3d 3d 20 49 46 46 5f 4c 4f 4f 50 42 41  K) == IFF_LOOPBA
6e20: 43 4b 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74  CK) {...Tcl_List
6e30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6e40: 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20  (interp, flags, 
6e50: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6e60: 28 22 4c 4f 4f 50 42 41 43 4b 22 2c 20 2d 31 29  ("LOOPBACK", -1)
6e70: 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67  );..}..if ((flag
6e80: 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f  s_bitmask & IFF_
6e90: 4e 4f 54 52 41 49 4c 45 52 53 29 20 3d 3d 20 49  NOTRAILERS) == I
6ea0: 46 46 5f 4e 4f 54 52 41 49 4c 45 52 53 29 20 7b  FF_NOTRAILERS) {
6eb0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
6ec0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6ed0: 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e  rp, flags, Tcl_N
6ee0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 54  ewStringObj("NOT
6ef0: 52 41 49 4c 45 52 53 22 2c 20 2d 31 29 29 3b 0a  RAILERS", -1));.
6f00: 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62  .}..if ((flags_b
6f10: 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 52 55 4e  itmask & IFF_RUN
6f20: 4e 49 4e 47 29 20 3d 3d 20 49 46 46 5f 52 55 4e  NING) == IFF_RUN
6f30: 4e 49 4e 47 29 20 7b 0a 09 09 54 63 6c 5f 4c 69  NING) {...Tcl_Li
6f40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6f50: 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73  nt(interp, flags
6f60: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6f70: 62 6a 28 22 52 55 4e 4e 49 4e 47 22 2c 20 2d 31  bj("RUNNING", -1
6f80: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61  ));..}..if ((fla
6f90: 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46  gs_bitmask & IFF
6fa0: 5f 4e 4f 41 52 50 29 20 3d 3d 20 49 46 46 5f 4e  _NOARP) == IFF_N
6fb0: 4f 41 52 50 29 20 7b 0a 09 09 54 63 6c 5f 4c 69  OARP) {...Tcl_Li
6fc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6fd0: 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73  nt(interp, flags
6fe0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6ff0: 62 6a 28 22 4e 4f 41 52 50 22 2c 20 2d 31 29 29  bj("NOARP", -1))
7000: 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73  ;..}..if ((flags
7010: 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 50  _bitmask & IFF_P
7020: 52 4f 4d 49 53 43 29 20 3d 3d 20 49 46 46 5f 50  ROMISC) == IFF_P
7030: 52 4f 4d 49 53 43 29 20 7b 0a 09 09 54 63 6c 5f  ROMISC) {...Tcl_
7040: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7050: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61  ment(interp, fla
7060: 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  gs, Tcl_NewStrin
7070: 67 4f 62 6a 28 22 50 52 4f 4d 49 53 43 22 2c 20  gObj("PROMISC", 
7080: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66  -1));..}..if ((f
7090: 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49  lags_bitmask & I
70a0: 46 46 5f 41 4c 4c 4d 55 4c 54 49 29 20 3d 3d 20  FF_ALLMULTI) == 
70b0: 49 46 46 5f 41 4c 4c 4d 55 4c 54 49 29 20 7b 0a  IFF_ALLMULTI) {.
70c0: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
70d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
70e0: 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65  p, flags, Tcl_Ne
70f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 41 4c 4c 4d  wStringObj("ALLM
7100: 55 4c 54 49 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  ULTI", -1));..}.
7110: 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d  .if ((flags_bitm
7120: 61 73 6b 20 26 20 49 46 46 5f 4d 41 53 54 45 52  ask & IFF_MASTER
7130: 29 20 3d 3d 20 49 46 46 5f 4d 41 53 54 45 52 29  ) == IFF_MASTER)
7140: 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   {...Tcl_ListObj
7150: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
7160: 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c  terp, flags, Tcl
7170: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4d  _NewStringObj("M
7180: 41 53 54 45 52 22 2c 20 2d 31 29 29 3b 0a 09 7d  ASTER", -1));..}
7190: 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74  ..if ((flags_bit
71a0: 6d 61 73 6b 20 26 20 49 46 46 5f 53 4c 41 56 45  mask & IFF_SLAVE
71b0: 29 20 3d 3d 20 49 46 46 5f 53 4c 41 56 45 29 20  ) == IFF_SLAVE) 
71c0: 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  {...Tcl_ListObjA
71d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
71e0: 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f  erp, flags, Tcl_
71f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 53 4c  NewStringObj("SL
7200: 41 56 45 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  AVE", -1));..}..
7210: 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61  if ((flags_bitma
7220: 73 6b 20 26 20 49 46 46 5f 4d 55 4c 54 49 43 41  sk & IFF_MULTICA
7230: 53 54 29 20 3d 3d 20 49 46 46 5f 4d 55 4c 54 49  ST) == IFF_MULTI
7240: 43 41 53 54 29 20 7b 0a 09 09 54 63 6c 5f 4c 69  CAST) {...Tcl_Li
7250: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7260: 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73  nt(interp, flags
7270: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
7280: 62 6a 28 22 4d 55 4c 54 49 43 41 53 54 22 2c 20  bj("MULTICAST", 
7290: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66  -1));..}..if ((f
72a0: 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49  lags_bitmask & I
72b0: 46 46 5f 50 4f 52 54 53 45 4c 29 20 3d 3d 20 49  FF_PORTSEL) == I
72c0: 46 46 5f 50 4f 52 54 53 45 4c 29 20 7b 0a 09 09  FF_PORTSEL) {...
72d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
72e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
72f0: 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53   flags, Tcl_NewS
7300: 74 72 69 6e 67 4f 62 6a 28 22 50 4f 52 54 53 45  tringObj("PORTSE
7310: 4c 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  L", -1));..}..if
7320: 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b   ((flags_bitmask
7330: 20 26 20 49 46 46 5f 41 55 54 4f 4d 45 44 49 41   & IFF_AUTOMEDIA
7340: 29 20 3d 3d 20 49 46 46 5f 41 55 54 4f 4d 45 44  ) == IFF_AUTOMED
7350: 49 41 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74  IA) {...Tcl_List
7360: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
7370: 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20  (interp, flags, 
7380: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7390: 28 22 41 55 54 4f 4d 45 44 49 41 22 2c 20 2d 31  ("AUTOMEDIA", -1
73a0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61  ));..}..if ((fla
73b0: 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46  gs_bitmask & IFF
73c0: 5f 44 59 4e 41 4d 49 43 29 20 3d 3d 20 49 46 46  _DYNAMIC) == IFF
73d0: 5f 44 59 4e 41 4d 49 43 29 20 7b 0a 09 09 54 63  _DYNAMIC) {...Tc
73e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
73f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66  lement(interp, f
7400: 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72  lags, Tcl_NewStr
7410: 69 6e 67 4f 62 6a 28 22 44 59 4e 41 4d 49 43 22  ingObj("DYNAMIC"
7420: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
7430: 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26  (flags_bitmask &
7440: 20 49 46 46 5f 4c 4f 57 45 52 5f 55 50 29 20 3d   IFF_LOWER_UP) =
7450: 3d 20 49 46 46 5f 4c 4f 57 45 52 5f 55 50 29 20  = IFF_LOWER_UP) 
7460: 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  {...Tcl_ListObjA
7470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7480: 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f  erp, flags, Tcl_
7490: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4c 4f  NewStringObj("LO
74a0: 57 45 52 5f 55 50 22 2c 20 2d 31 29 29 3b 0a 09  WER_UP", -1));..
74b0: 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69  }..if ((flags_bi
74c0: 74 6d 61 73 6b 20 26 20 49 46 46 5f 44 4f 52 4d  tmask & IFF_DORM
74d0: 41 4e 54 29 20 3d 3d 20 49 46 46 5f 44 4f 52 4d  ANT) == IFF_DORM
74e0: 41 4e 54 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73  ANT) {...Tcl_Lis
74f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
7500: 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c  t(interp, flags,
7510: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7520: 6a 28 22 44 4f 52 4d 41 4e 54 22 2c 20 2d 31 29  j("DORMANT", -1)
7530: 29 3b 0a 09 7d 0a 23 69 66 64 65 66 20 49 46 46  );..}.#ifdef IFF
7540: 5f 45 43 48 4f 0a 09 69 66 20 28 28 66 6c 61 67  _ECHO..if ((flag
7550: 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f  s_bitmask & IFF_
7560: 45 43 48 4f 29 20 3d 3d 20 49 46 46 5f 45 43 48  ECHO) == IFF_ECH
7570: 4f 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  O) {...Tcl_ListO
7580: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7590: 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54  interp, flags, T
75a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
75b0: 22 45 43 48 4f 22 2c 20 2d 31 29 29 3b 0a 09 7d  "ECHO", -1));..}
75c0: 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 41 64 64  .#endif.../* Add
75d0: 20 61 72 72 61 79 2d 63 6f 6d 70 6c 69 61 6e 74   array-compliant
75e0: 2f 64 69 63 74 20 65 6e 74 72 79 20 74 6f 20 74  /dict entry to t
75f0: 68 65 20 72 65 74 75 72 6e 20 6c 69 73 74 20 2a  he return list *
7600: 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
7610: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
7620: 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c  rp, retlist, Tcl
7630: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66  _NewStringObj("f
7640: 6c 61 67 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63  lags", -1));..Tc
7650: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7660: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
7670: 65 74 6c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  etlist, flags);.
7680: 0a 09 2f 2a 20 46 65 74 63 68 20 6f 74 68 65 72  ../* Fetch other
7690: 20 61 74 74 72 69 62 75 74 65 73 20 66 72 6f 6d   attributes from
76a0: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 2a   the interface *
76b0: 2f 0a 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69  /..ioctl_ret = i
76c0: 6f 63 74 6c 28 73 6f 63 6b 2c 20 53 49 4f 43 47  octl(sock, SIOCG
76d0: 49 46 48 57 41 44 44 52 2c 20 26 69 66 61 63 65  IFHWADDR, &iface
76e0: 5f 72 65 71 29 3b 0a 09 69 66 20 28 69 6f 63 74  _req);..if (ioct
76f0: 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09  l_ret == 0) {...
7700: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 75 6e  link_encap = "un
7710: 6b 6e 6f 77 6e 22 3b 0a 0a 09 09 61 64 64 72 5f  known";....addr_
7720: 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  data = (unsigned
7730: 20 63 68 61 72 20 2a 29 20 69 66 61 63 65 5f 72   char *) iface_r
7740: 65 71 2e 69 66 72 5f 68 77 61 64 64 72 2e 73 61  eq.ifr_hwaddr.sa
7750: 5f 64 61 74 61 3b 0a 09 09 73 77 69 74 63 68 20  _data;...switch 
7760: 28 69 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 68  (iface_req.ifr_h
7770: 77 61 64 64 72 2e 73 61 5f 66 61 6d 69 6c 79 29  waddr.sa_family)
7780: 20 7b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52   {....case ARPHR
7790: 44 5f 45 54 48 45 52 3a 0a 09 09 09 09 6c 69 6e  D_ETHER:.....lin
77a0: 6b 5f 65 6e 63 61 70 20 3d 20 22 65 74 68 65 72  k_encap = "ether
77b0: 6e 65 74 22 3b 0a 0a 09 09 09 09 54 63 6c 5f 4c  net";......Tcl_L
77c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
77d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 74 6c  ent(interp, retl
77e0: 69 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ist, Tcl_NewStri
77f0: 6e 67 4f 62 6a 28 22 68 77 61 64 64 72 22 2c 20  ngObj("hwaddr", 
7800: 2d 31 29 29 3b 0a 09 09 09 09 54 63 6c 5f 4c 69  -1));.....Tcl_Li
7810: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7820: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 74 6c 69  nt(interp, retli
7830: 73 74 2c 0a 09 09 09 09 20 20 54 63 6c 5f 4f 62  st,.....  Tcl_Ob
7840: 6a 50 72 69 6e 74 66 28 22 25 30 32 78 3a 25 30  jPrintf("%02x:%0
7850: 32 78 3a 25 30 32 78 3a 25 30 32 78 3a 25 30 32  2x:%02x:%02x:%02
7860: 78 3a 25 30 32 78 22 2c 0a 09 09 09 09 20 20 20  x:%02x",.....   
7870: 20 61 64 64 72 5f 64 61 74 61 5b 30 5d 2c 0a 09   addr_data[0],..
7880: 09 09 09 20 20 20 20 61 64 64 72 5f 64 61 74 61  ...    addr_data
7890: 5b 31 5d 2c 0a 09 09 09 09 20 20 20 20 61 64 64  [1],.....    add
78a0: 72 5f 64 61 74 61 5b 32 5d 2c 0a 09 09 09 09 20  r_data[2],..... 
78b0: 20 20 20 61 64 64 72 5f 64 61 74 61 5b 33 5d 2c     addr_data[3],
78c0: 0a 09 09 09 09 20 20 20 20 61 64 64 72 5f 64 61  .....    addr_da
78d0: 74 61 5b 34 5d 2c 0a 09 09 09 09 20 20 20 20 61  ta[4],.....    a
78e0: 64 64 72 5f 64 61 74 61 5b 35 5d 0a 09 09 09 09  ddr_data[5].....
78f0: 20 20 29 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09    ).....);......
7900: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41  break;....case A
7910: 52 50 48 52 44 5f 41 58 32 35 3a 0a 09 09 09 09  RPHRD_AX25:.....
7920: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 61 78  link_encap = "ax
7930: 32 35 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  25";.....break;.
7940: 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 50  ...case ARPHRD_P
7950: 52 4f 4e 45 54 3a 0a 09 09 09 09 6c 69 6e 6b 5f  RONET:.....link_
7960: 65 6e 63 61 70 20 3d 20 22 70 72 6f 6e 65 74 22  encap = "pronet"
7970: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
7980: 63 61 73 65 20 41 52 50 48 52 44 5f 43 48 41 4f  case ARPHRD_CHAO
7990: 53 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61  S:.....link_enca
79a0: 70 20 3d 20 22 63 68 61 6f 73 22 3b 0a 09 09 09  p = "chaos";....
79b0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
79c0: 41 52 50 48 52 44 5f 49 45 45 45 38 30 32 3a 0a  ARPHRD_IEEE802:.
79d0: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d  ....link_encap =
79e0: 20 22 69 65 65 65 38 30 32 22 3b 0a 09 09 09 09   "ieee802";.....
79f0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41  break;....case A
7a00: 52 50 48 52 44 5f 41 52 43 4e 45 54 3a 0a 09 09  RPHRD_ARCNET:...
7a10: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22  ..link_encap = "
7a20: 61 72 63 6e 65 74 22 3b 0a 09 09 09 09 62 72 65  arcnet";.....bre
7a30: 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48  ak;....case ARPH
7a40: 52 44 5f 41 50 50 4c 45 54 4c 4b 3a 0a 09 09 09  RD_APPLETLK:....
7a50: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 61  .link_encap = "a
7a60: 70 70 6c 65 74 6c 6b 22 3b 0a 09 09 09 09 62 72  ppletlk";.....br
7a70: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50  eak;....case ARP
7a80: 48 52 44 5f 44 4c 43 49 3a 0a 09 09 09 09 6c 69  HRD_DLCI:.....li
7a90: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 64 6c 63 69  nk_encap = "dlci
7aa0: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ";.....break;...
7ab0: 09 63 61 73 65 20 41 52 50 48 52 44 5f 41 54 4d  .case ARPHRD_ATM
7ac0: 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70  :.....link_encap
7ad0: 20 3d 20 22 61 74 6d 22 3b 0a 09 09 09 09 62 72   = "atm";.....br
7ae0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50  eak;....case ARP
7af0: 48 52 44 5f 4d 45 54 52 49 43 4f 4d 3a 0a 09 09  HRD_METRICOM:...
7b00: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22  ..link_encap = "
7b10: 6d 65 74 72 69 63 6f 6d 22 3b 0a 09 09 09 09 62  metricom";.....b
7b20: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52  reak;....case AR
7b30: 50 48 52 44 5f 49 45 45 45 31 33 39 34 3a 0a 09  PHRD_IEEE1394:..
7b40: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20  ...link_encap = 
7b50: 22 69 65 65 65 31 33 39 34 22 3b 0a 09 09 09 09  "ieee1394";.....
7b60: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41  break;....case A
7b70: 52 50 48 52 44 5f 45 55 49 36 34 3a 0a 09 09 09  RPHRD_EUI64:....
7b80: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 65  .link_encap = "e
7b90: 75 69 36 34 22 3b 0a 09 09 09 09 62 72 65 61 6b  ui64";.....break
7ba0: 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44  ;....case ARPHRD
7bb0: 5f 49 4e 46 49 4e 49 42 41 4e 44 3a 0a 09 09 09  _INFINIBAND:....
7bc0: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 69  .link_encap = "i
7bd0: 6e 66 69 6e 69 62 61 6e 64 22 3b 0a 09 09 09 09  nfiniband";.....
7be0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41  break;....case A
7bf0: 52 50 48 52 44 5f 53 4c 49 50 3a 0a 09 09 09 09  RPHRD_SLIP:.....
7c00: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 73 6c  link_encap = "sl
7c10: 69 70 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ip";.....break;.
7c20: 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 43  ...case ARPHRD_C
7c30: 53 4c 49 50 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65  SLIP:.....link_e
7c40: 6e 63 61 70 20 3d 20 22 63 73 6c 69 70 22 3b 0a  ncap = "cslip";.
7c50: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
7c60: 73 65 20 41 52 50 48 52 44 5f 53 4c 49 50 36 3a  se ARPHRD_SLIP6:
7c70: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
7c80: 3d 20 22 73 6c 69 70 36 22 3b 0a 09 09 09 09 62  = "slip6";.....b
7c90: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52  reak;....case AR
7ca0: 50 48 52 44 5f 43 53 4c 49 50 36 3a 0a 09 09 09  PHRD_CSLIP6:....
7cb0: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 63  .link_encap = "c
7cc0: 73 6c 69 70 36 22 3b 0a 09 09 09 09 62 72 65 61  slip6";.....brea
7cd0: 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52  k;....case ARPHR
7ce0: 44 5f 52 53 52 56 44 3a 0a 09 09 09 09 6c 69 6e  D_RSRVD:.....lin
7cf0: 6b 5f 65 6e 63 61 70 20 3d 20 22 72 73 72 76 64  k_encap = "rsrvd
7d00: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ";.....break;...
7d10: 09 63 61 73 65 20 41 52 50 48 52 44 5f 41 44 41  .case ARPHRD_ADA
7d20: 50 54 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63  PT:.....link_enc
7d30: 61 70 20 3d 20 22 61 64 61 70 74 22 3b 0a 09 09  ap = "adapt";...
7d40: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7d50: 20 41 52 50 48 52 44 5f 52 4f 53 45 3a 0a 09 09   ARPHRD_ROSE:...
7d60: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22  ..link_encap = "
7d70: 72 6f 73 65 22 3b 0a 09 09 09 09 62 72 65 61 6b  rose";.....break
7d80: 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44  ;....case ARPHRD
7d90: 5f 58 32 35 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65  _X25:.....link_e
7da0: 6e 63 61 70 20 3d 20 22 78 32 35 22 3b 0a 09 09  ncap = "x25";...
7db0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7dc0: 20 41 52 50 48 52 44 5f 48 57 58 32 35 3a 0a 09   ARPHRD_HWX25:..
7dd0: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20  ...link_encap = 
7de0: 22 68 77 78 32 35 22 3b 0a 09 09 09 09 62 72 65  "hwx25";.....bre
7df0: 61 6b 3b 0a 23 69 66 64 65 66 20 41 52 50 48 52  ak;.#ifdef ARPHR
7e00: 44 5f 43 41 4e 0a 09 09 09 63 61 73 65 20 41 52  D_CAN....case AR
7e10: 50 48 52 44 5f 43 41 4e 3a 0a 09 09 09 09 6c 69  PHRD_CAN:.....li
7e20: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 63 61 6e 22  nk_encap = "can"
7e30: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e  ;.....break;.#en
7e40: 64 69 66 0a 09 09 09 63 61 73 65 20 41 52 50 48  dif....case ARPH
7e50: 52 44 5f 50 50 50 3a 0a 09 09 09 09 6c 69 6e 6b  RD_PPP:.....link
7e60: 5f 65 6e 63 61 70 20 3d 20 22 70 70 70 22 3b 0a  _encap = "ppp";.
7e70: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
7e80: 73 65 20 41 52 50 48 52 44 5f 43 49 53 43 4f 3a  se ARPHRD_CISCO:
7e90: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
7ea0: 3d 20 22 63 69 73 63 6f 22 3b 0a 09 09 09 09 62  = "cisco";.....b
7eb0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52  reak;....case AR
7ec0: 50 48 52 44 5f 4c 41 50 42 3a 0a 09 09 09 09 6c  PHRD_LAPB:.....l
7ed0: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 6c 61 70  ink_encap = "lap
7ee0: 62 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  b";.....break;..
7ef0: 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 44 44  ..case ARPHRD_DD
7f00: 43 4d 50 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e  CMP:.....link_en
7f10: 63 61 70 20 3d 20 22 64 64 63 6d 70 22 3b 0a 09  cap = "ddcmp";..
7f20: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
7f30: 65 20 41 52 50 48 52 44 5f 52 41 57 48 44 4c 43  e ARPHRD_RAWHDLC
7f40: 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70  :.....link_encap
7f50: 20 3d 20 22 72 61 77 68 64 6c 63 22 3b 0a 09 09   = "rawhdlc";...
7f60: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7f70: 20 41 52 50 48 52 44 5f 54 55 4e 4e 45 4c 3a 0a   ARPHRD_TUNNEL:.
7f80: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d  ....link_encap =
7f90: 20 22 74 75 6e 6e 65 6c 22 3b 0a 09 09 09 09 62   "tunnel";.....b
7fa0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52  reak;....case AR
7fb0: 50 48 52 44 5f 54 55 4e 4e 45 4c 36 3a 0a 09 09  PHRD_TUNNEL6:...
7fc0: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22  ..link_encap = "
7fd0: 74 75 6e 6e 65 6c 36 22 3b 0a 09 09 09 09 62 72  tunnel6";.....br
7fe0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50  eak;....case ARP
7ff0: 48 52 44 5f 46 52 41 44 3a 0a 09 09 09 09 6c 69  HRD_FRAD:.....li
8000: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 66 72 61 64  nk_encap = "frad
8010: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ";.....break;...
8020: 09 63 61 73 65 20 41 52 50 48 52 44 5f 53 4b 49  .case ARPHRD_SKI
8030: 50 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61  P:.....link_enca
8040: 70 20 3d 20 22 73 6b 69 70 22 3b 0a 09 09 09 09  p = "skip";.....
8050: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41  break;....case A
8060: 52 50 48 52 44 5f 4c 4f 4f 50 42 41 43 4b 3a 0a  RPHRD_LOOPBACK:.
8070: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d  ....link_encap =
8080: 20 22 6c 6f 6f 70 62 61 63 6b 22 3b 0a 09 09 09   "loopback";....
8090: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
80a0: 41 52 50 48 52 44 5f 4c 4f 43 41 4c 54 4c 4b 3a  ARPHRD_LOCALTLK:
80b0: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
80c0: 3d 20 22 6c 6f 63 61 6c 74 61 6c 6b 22 3b 0a 09  = "localtalk";..
80d0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
80e0: 65 20 41 52 50 48 52 44 5f 46 44 44 49 3a 0a 09  e ARPHRD_FDDI:..
80f0: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20  ...link_encap = 
8100: 22 66 64 64 69 22 3b 0a 09 09 09 09 62 72 65 61  "fddi";.....brea
8110: 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52  k;....case ARPHR
8120: 44 5f 42 49 46 3a 0a 09 09 09 09 6c 69 6e 6b 5f  D_BIF:.....link_
8130: 65 6e 63 61 70 20 3d 20 22 62 69 66 22 3b 0a 09  encap = "bif";..
8140: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
8150: 65 20 41 52 50 48 52 44 5f 53 49 54 3a 0a 09 09  e ARPHRD_SIT:...
8160: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22  ..link_encap = "
8170: 73 69 74 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b  sit";.....break;
8180: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f  ....case ARPHRD_
8190: 49 50 44 44 50 3a 0a 09 09 09 09 6c 69 6e 6b 5f  IPDDP:.....link_
81a0: 65 6e 63 61 70 20 3d 20 22 69 70 64 64 70 22 3b  encap = "ipddp";
81b0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
81c0: 61 73 65 20 41 52 50 48 52 44 5f 49 50 47 52 45  ase ARPHRD_IPGRE
81d0: 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70  :.....link_encap
81e0: 20 3d 20 22 67 72 65 22 3b 0a 09 09 09 09 62 72   = "gre";.....br
81f0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50  eak;....case ARP
8200: 48 52 44 5f 50 49 4d 52 45 47 3a 0a 09 09 09 09  HRD_PIMREG:.....
8210: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 70 69  link_encap = "pi
8220: 6d 72 65 67 22 3b 0a 09 09 09 09 62 72 65 61 6b  mreg";.....break
8230: 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44  ;....case ARPHRD
8240: 5f 48 49 50 50 49 3a 0a 09 09 09 09 6c 69 6e 6b  _HIPPI:.....link
8250: 5f 65 6e 63 61 70 20 3d 20 22 68 69 70 70 69 22  _encap = "hippi"
8260: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
8270: 63 61 73 65 20 41 52 50 48 52 44 5f 41 53 48 3a  case ARPHRD_ASH:
8280: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
8290: 3d 20 22 61 73 68 22 3b 0a 09 09 09 09 62 72 65  = "ash";.....bre
82a0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48  ak;....case ARPH
82b0: 52 44 5f 45 43 4f 4e 45 54 3a 0a 09 09 09 09 6c  RD_ECONET:.....l
82c0: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 65 63 6f  ink_encap = "eco
82d0: 6e 65 74 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b  net";.....break;
82e0: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f  ....case ARPHRD_
82f0: 49 52 44 41 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65  IRDA:.....link_e
8300: 6e 63 61 70 20 3d 20 22 69 72 64 61 22 3b 0a 09  ncap = "irda";..
8310: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
8320: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
8330: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8340: 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e  , retlist, Tcl_N
8350: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 6e  ewStringObj("lin
8360: 6b 5f 65 6e 63 61 70 22 2c 20 2d 31 29 29 3b 0a  k_encap", -1));.
8370: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
8380: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8390: 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f  p, retlist, Tcl_
83a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6c 69 6e  NewStringObj(lin
83b0: 6b 5f 65 6e 63 61 70 2c 20 2d 31 29 29 3b 0a 09  k_encap, -1));..
83c0: 7d 0a 0a 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20  }...ioctl_ret = 
83d0: 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 53 49 4f 43  ioctl(sock, SIOC
83e0: 47 49 46 4d 45 54 52 49 43 2c 20 26 69 66 61 63  GIFMETRIC, &ifac
83f0: 65 5f 72 65 71 29 3b 0a 09 69 66 20 28 69 6f 63  e_req);..if (ioc
8400: 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09  tl_ret == 0) {..
8410: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
8420: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8430: 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e  , retlist, Tcl_N
8440: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 74  ewStringObj("met
8450: 72 69 63 22 2c 20 2d 31 29 29 3b 0a 09 09 54 63  ric", -1));...Tc
8460: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8470: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
8480: 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 57  etlist, Tcl_NewW
8490: 69 64 65 49 6e 74 4f 62 6a 28 69 66 61 63 65 5f  ideIntObj(iface_
84a0: 72 65 71 2e 69 66 72 5f 6d 65 74 72 69 63 20 2b  req.ifr_metric +
84b0: 20 31 29 29 3b 0a 09 7d 0a 0a 09 69 6f 63 74 6c   1));..}...ioctl
84c0: 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63  _ret = ioctl(soc
84d0: 6b 2c 20 53 49 4f 43 47 49 46 4d 54 55 2c 20 26  k, SIOCGIFMTU, &
84e0: 69 66 61 63 65 5f 72 65 71 29 3b 0a 09 69 66 20  iface_req);..if 
84f0: 28 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29  (ioctl_ret == 0)
8500: 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   {...Tcl_ListObj
8510: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8520: 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54  terp, retlist, T
8530: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8540: 22 6d 74 75 22 2c 20 2d 31 29 29 3b 0a 09 09 54  "mtu", -1));...T
8550: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8560: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8570: 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e 65 77  retlist, Tcl_New
8580: 57 69 64 65 49 6e 74 4f 62 6a 28 69 66 61 63 65  WideIntObj(iface
8590: 5f 72 65 71 2e 69 66 72 5f 6d 74 75 29 29 3b 0a  _req.ifr_mtu));.
85a0: 09 7d 0a 0a 09 69 6f 63 74 6c 5f 72 65 74 20 3d  .}...ioctl_ret =
85b0: 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 53 49 4f   ioctl(sock, SIO
85c0: 43 47 49 46 49 4e 44 45 58 2c 20 26 69 66 61 63  CGIFINDEX, &ifac
85d0: 65 5f 72 65 71 29 3b 0a 09 69 66 20 28 69 6f 63  e_req);..if (ioc
85e0: 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09  tl_ret == 0) {..
85f0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
8600: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8610: 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e  , retlist, Tcl_N
8620: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 64  ewStringObj("ind
8630: 65 78 22 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c  ex", -1));...Tcl
8640: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8650: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
8660: 74 6c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 57 69  tlist, Tcl_NewWi
8670: 64 65 49 6e 74 4f 62 6a 28 69 66 61 63 65 5f 72  deIntObj(iface_r
8680: 65 71 2e 69 66 72 5f 69 66 69 6e 64 65 78 29 29  eq.ifr_ifindex))
8690: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f  ;..}...if (sock_
86a0: 76 34 20 21 3d 20 2d 31 29 20 7b 0a 09 09 69 6f  v4 != -1) {...io
86b0: 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28  ctl_ret = ioctl(
86c0: 73 6f 63 6b 5f 76 34 2c 20 53 49 4f 43 47 49 46  sock_v4, SIOCGIF
86d0: 41 44 44 52 2c 20 26 69 66 61 63 65 5f 72 65 71  ADDR, &iface_req
86e0: 29 3b 0a 09 09 69 66 20 28 69 6f 63 74 6c 5f 72  );...if (ioctl_r
86f0: 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 74 75  et == 0) {....tu
8700: 61 70 69 5f 70 72 69 76 61 74 65 5f 61 70 70 65  api_private_appe
8710: 6e 64 5f 73 6f 63 6b 61 64 64 72 5f 74 6f 5f 74  nd_sockaddr_to_t
8720: 63 6c 6f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65  clobj(interp, re
8730: 74 6c 69 73 74 2c 20 22 61 64 64 72 65 73 73 22  tlist, "address"
8740: 2c 20 26 69 66 61 63 65 5f 72 65 71 2e 69 66 72  , &iface_req.ifr
8750: 5f 61 64 64 72 29 3b 0a 09 09 7d 0a 0a 09 09 69  _addr);...}....i
8760: 66 20 28 66 6c 61 67 5f 70 6f 69 6e 74 6f 70 6f  f (flag_pointopo
8770: 69 6e 74 29 20 7b 0a 09 09 09 2f 2a 20 50 6f 69  int) {..../* Poi
8780: 6e 74 2d 74 6f 2d 50 6f 69 6e 74 20 69 6e 74 65  nt-to-Point inte
8790: 72 66 61 63 65 73 20 2a 2f 0a 09 09 09 69 6f 63  rfaces */....ioc
87a0: 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73  tl_ret = ioctl(s
87b0: 6f 63 6b 5f 76 34 2c 20 53 49 4f 43 47 49 46 44  ock_v4, SIOCGIFD
87c0: 53 54 41 44 44 52 2c 20 26 69 66 61 63 65 5f 72  STADDR, &iface_r
87d0: 65 71 29 3b 0a 09 09 09 69 66 20 28 69 6f 63 74  eq);....if (ioct
87e0: 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09  l_ret == 0) {...
87f0: 09 09 74 75 61 70 69 5f 70 72 69 76 61 74 65 5f  ..tuapi_private_
8800: 61 70 70 65 6e 64 5f 73 6f 63 6b 61 64 64 72 5f  append_sockaddr_
8810: 74 6f 5f 74 63 6c 6f 62 6a 28 69 6e 74 65 72 70  to_tclobj(interp
8820: 2c 20 72 65 74 6c 69 73 74 2c 20 22 64 65 73 74  , retlist, "dest
8830: 69 6e 61 74 69 6f 6e 22 2c 20 26 69 66 61 63 65  ination", &iface
8840: 5f 72 65 71 2e 69 66 72 5f 61 64 64 72 29 3b 0a  _req.ifr_addr);.
8850: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
8860: 66 6c 61 67 5f 62 72 6f 61 64 63 61 73 74 29 20  flag_broadcast) 
8870: 7b 0a 09 09 09 2f 2a 20 42 72 6f 61 64 63 61 73  {..../* Broadcas
8880: 74 20 69 6e 74 65 72 66 61 63 65 73 20 2a 2f 0a  t interfaces */.
8890: 09 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69  ...ioctl_ret = i
88a0: 6f 63 74 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49  octl(sock_v4, SI
88b0: 4f 43 47 49 46 42 52 44 41 44 44 52 2c 20 26 69  OCGIFBRDADDR, &i
88c0: 66 61 63 65 5f 72 65 71 29 3b 0a 09 09 09 69 66  face_req);....if
88d0: 20 28 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30   (ioctl_ret == 0
88e0: 29 20 7b 0a 09 09 09 09 74 75 61 70 69 5f 70 72  ) {.....tuapi_pr
88f0: 69 76 61 74 65 5f 61 70 70 65 6e 64 5f 73 6f 63  ivate_append_soc
8900: 6b 61 64 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a 28  kaddr_to_tclobj(
8910: 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c  interp, retlist,
8920: 20 22 62 72 6f 61 64 63 61 73 74 22 2c 20 26 69   "broadcast", &i
8930: 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 61 64 64  face_req.ifr_add
8940: 72 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  r);....}...}....
8950: 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74  ioctl_ret = ioct
8960: 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49 4f 43 47  l(sock_v4, SIOCG
8970: 49 46 4e 45 54 4d 41 53 4b 2c 20 26 69 66 61 63  IFNETMASK, &ifac
8980: 65 5f 72 65 71 29 3b 0a 09 09 69 66 20 28 69 6f  e_req);...if (io
8990: 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a  ctl_ret == 0) {.
89a0: 09 09 09 74 75 61 70 69 5f 70 72 69 76 61 74 65  ...tuapi_private
89b0: 5f 61 70 70 65 6e 64 5f 73 6f 63 6b 61 64 64 72  _append_sockaddr
89c0: 5f 74 6f 5f 74 63 6c 6f 62 6a 28 69 6e 74 65 72  _to_tclobj(inter
89d0: 70 2c 20 72 65 74 6c 69 73 74 2c 20 22 6e 65 74  p, retlist, "net
89e0: 6d 61 73 6b 22 2c 20 26 69 66 61 63 65 5f 72 65  mask", &iface_re
89f0: 71 2e 69 66 72 5f 61 64 64 72 29 3b 0a 09 09 7d  q.ifr_addr);...}
8a00: 0a 09 7d 0a 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  ..}...Tcl_SetObj
8a10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72  Result(interp, r
8a20: 65 74 6c 69 73 74 29 3b 0a 0a 09 72 65 74 75 72  etlist);...retur
8a30: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(TCL_OK);.}..st
8a40: 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 69  atic int tuapi_i
8a50: 66 63 6f 6e 66 69 67 5f 63 6f 6e 66 28 43 6c 69  fconfig_conf(Cli
8a60: 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f  entData cd, Tcl_
8a70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8a80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
8a90: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c  j *CONST objv[],
8aa0: 20 69 6e 74 20 73 6f 63 6b 2c 20 69 6e 74 20 73   int sock, int s
8ab0: 6f 63 6b 5f 76 34 2c 20 69 6e 74 20 73 6f 63 6b  ock_v4, int sock
8ac0: 5f 76 36 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  _v6) {..Tcl_Obj 
8ad0: 2a 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a  *option_name_obj
8ae0: 2c 20 2a 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62  , *option_val_ob
8af0: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 66 6c  j;..Tcl_Obj **fl
8b00: 61 67 73 5f 6f 62 6a 76 3b 0a 09 73 74 72 75 63  ags_objv;..struc
8b10: 74 20 69 66 72 65 71 20 69 66 61 63 65 5f 72 65  t ifreq iface_re
8b20: 71 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61  q;..struct socka
8b30: 64 64 72 20 2a 74 6d 70 5f 69 6f 63 74 6c 5f 61  ddr *tmp_ioctl_a
8b40: 64 64 72 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72  ddr;..const char
8b50: 20 2a 69 66 61 63 65 3b 0a 09 73 68 6f 72 74 20   *iface;..short 
8b60: 66 6c 61 67 73 3b 0a 09 69 6e 74 20 66 6c 61 67  flags;..int flag
8b70: 73 5f 6f 62 6a 63 3b 0a 09 69 6e 74 20 74 6d 70  s_objc;..int tmp
8b80: 5f 73 6f 63 6b 2c 20 74 6d 70 5f 69 6f 63 74 6c  _sock, tmp_ioctl
8b90: 3b 0a 09 69 6e 74 20 69 6f 63 74 6c 5f 72 65 74  ;..int ioctl_ret
8ba0: 2c 20 74 63 6c 5f 72 65 74 2c 20 70 61 72 73 65  , tcl_ret, parse
8bb0: 5f 72 65 74 3b 0a 0a 09 69 66 61 63 65 20 3d 20  _ret;...iface = 
8bc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
8bd0: 6a 76 5b 31 5d 29 3b 0a 0a 09 69 66 20 28 28 73  jv[1]);...if ((s
8be0: 74 72 6c 65 6e 28 69 66 61 63 65 29 20 2b 20 31  trlen(iface) + 1
8bf0: 29 20 3e 3d 20 49 46 4e 41 4d 53 49 5a 29 20 7b  ) >= IFNAMSIZ) {
8c00: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
8c10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
8c20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e  NewStringObj("in
8c30: 74 65 72 66 61 63 65 20 6e 61 6d 65 20 74 6f 6f  terface name too
8c40: 20 6c 6f 6e 67 22 2c 20 2d 31 29 29 3b 0a 0a 09   long", -1));...
8c50: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
8c60: 52 29 3b 0a 09 7d 0a 0a 09 6f 62 6a 63 20 2d 3d  R);..}...objc -=
8c70: 20 32 3b 0a 09 6f 62 6a 76 20 2b 3d 20 32 3b 0a   2;..objv += 2;.
8c80: 0a 09 66 6f 72 20 28 3b 20 6f 62 6a 63 20 3e 20  ..for (; objc > 
8c90: 30 3b 20 6f 62 6a 63 2d 2d 2c 6f 62 6a 76 2b 2b  0; objc--,objv++
8ca0: 29 20 7b 0a 09 09 2f 2a 20 50 72 65 70 61 72 65  ) {.../* Prepare
8cb0: 20 66 6f 72 20 61 6e 20 69 6f 63 74 6c 28 29 20   for an ioctl() 
8cc0: 2a 2f 0a 09 09 73 74 72 63 70 79 28 69 66 61 63  */...strcpy(ifac
8cd0: 65 5f 72 65 71 2e 69 66 72 5f 6e 61 6d 65 2c 20  e_req.ifr_name, 
8ce0: 69 66 61 63 65 29 3b 0a 09 09 74 6d 70 5f 69 6f  iface);...tmp_io
8cf0: 63 74 6c 20 3d 20 2d 31 3b 0a 0a 09 09 6f 70 74  ctl = -1;....opt
8d00: 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 20 3d 20 6f  ion_name_obj = o
8d10: 62 6a 76 5b 30 5d 3b 0a 0a 09 09 69 66 20 28 6f  bjv[0];....if (o
8d20: 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 09 09 54  bjc == 1) {....T
8d30: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
8d40: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50  interp, Tcl_ObjP
8d50: 72 69 6e 74 66 28 22 6f 70 74 69 6f 6e 20 5c 22  rintf("option \"
8d60: 25 73 5c 22 20 72 65 71 75 69 72 65 73 20 61 6e  %s\" requires an
8d70: 20 61 72 67 75 6d 65 6e 74 22 2c 20 54 63 6c 5f   argument", Tcl_
8d80: 47 65 74 53 74 72 69 6e 67 28 6f 70 74 69 6f 6e  GetString(option
8d90: 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29 3b 0a 0a 09  _name_obj)));...
8da0: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
8db0: 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 6f 62 6a 63  OR);...}....objc
8dc0: 2d 2d 3b 0a 09 09 6f 62 6a 76 2b 2b 3b 0a 0a 09  --;...objv++;...
8dd0: 09 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a 20  .option_val_obj 
8de0: 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 09 09 73 77  = objv[0];....sw
8df0: 69 74 63 68 20 28 74 75 61 70 69 5f 69 6e 74 65  itch (tuapi_inte
8e00: 72 6e 61 6c 5f 73 69 6d 70 6c 65 68 61 73 68 5f  rnal_simplehash_
8e10: 6f 62 6a 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f  obj(option_name_
8e20: 6f 62 6a 29 29 20 7b 0a 09 09 09 63 61 73 65 20  obj)) {....case 
8e30: 30 78 36 64 39 38 37 30 66 33 3a 20 2f 2a 20 66  0x6d9870f3: /* f
8e40: 6c 61 67 73 20 2a 2f 0a 09 09 09 09 66 6c 61 67  lags */.....flag
8e50: 73 20 3d 20 30 3b 0a 0a 09 09 09 09 74 63 6c 5f  s = 0;......tcl_
8e60: 72 65 74 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62  ret = Tcl_ListOb
8e70: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
8e80: 65 72 70 2c 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f  erp, option_val_
8e90: 6f 62 6a 2c 20 26 66 6c 61 67 73 5f 6f 62 6a 63  obj, &flags_objc
8ea0: 2c 20 26 66 6c 61 67 73 5f 6f 62 6a 76 29 3b 0a  , &flags_objv);.
8eb0: 09 09 09 09 69 66 20 28 74 63 6c 5f 72 65 74 20  ....if (tcl_ret 
8ec0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09  != TCL_OK) {....
8ed0: 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74  ..return(tcl_ret
8ee0: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f  );.....}......fo
8ef0: 72 20 28 3b 20 66 6c 61 67 73 5f 6f 62 6a 63 20  r (; flags_objc 
8f00: 3e 20 30 3b 20 66 6c 61 67 73 5f 6f 62 6a 63 2d  > 0; flags_objc-
8f10: 2d 2c 66 6c 61 67 73 5f 6f 62 6a 76 2b 2b 29 20  -,flags_objv++) 
8f20: 7b 0a 09 09 09 09 09 73 77 69 74 63 68 20 28 74  {......switch (t
8f30: 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69  uapi_internal_si
8f40: 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 66 6c 61  mplehash_obj(fla
8f50: 67 73 5f 6f 62 6a 76 5b 30 5d 29 29 20 7b 0a 09  gs_objv[0])) {..
8f60: 09 09 09 09 09 63 61 73 65 20 30 78 32 61 64 30  .....case 0x2ad0
8f70: 3a 20 2f 2a 20 55 50 20 2a 2f 0a 09 09 09 09 09  : /* UP */......
8f80: 09 09 66 6c 61 67 73 20 7c 3d 20 49 46 46 5f 55  ..flags |= IFF_U
8f90: 50 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b  P;........break;
8fa0: 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 31 61  .......case 0x1a
8fb0: 65 66 37 66 35 34 3a 20 2f 2a 20 42 52 4f 41 44  ef7f54: /* BROAD
8fc0: 43 41 53 54 20 2a 2f 0a 09 09 09 09 09 09 09 66  CAST */........f
8fd0: 6c 61 67 73 20 7c 3d 20 49 46 46 5f 42 52 4f 41  lags |= IFF_BROA
8fe0: 44 43 41 53 54 3b 0a 09 09 09 09 09 09 09 62 72  DCAST;........br
8ff0: 65 61 6b 3b 0a 09 09 09 09 09 09 63 61 73 65 20  eak;.......case 
9000: 30 78 63 32 35 32 61 62 64 34 3a 20 2f 2a 20 50  0xc252abd4: /* P
9010: 4f 49 4e 54 4f 50 4f 49 4e 54 20 2a 2f 0a 09 09  OINTOPOINT */...
9020: 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 46  .....flags |= IF
9030: 46 5f 50 4f 49 4e 54 4f 50 4f 49 4e 54 3b 0a 09  F_POINTOPOINT;..
9040: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
9050: 09 09 09 63 61 73 65 20 30 78 34 38 62 30 61 38  ...case 0x48b0a8
9060: 63 37 3a 20 2f 2a 20 44 45 42 55 47 20 2a 2f 0a  c7: /* DEBUG */.
9070: 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20  .......flags |= 
9080: 49 46 46 5f 44 45 42 55 47 3b 0a 09 09 09 09 09  IFF_DEBUG;......
9090: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 63  ..break;.......c
90a0: 61 73 65 20 30 78 34 64 33 64 62 63 64 33 3a 20  ase 0x4d3dbcd3: 
90b0: 2f 2a 20 4e 4f 54 52 41 49 4c 45 52 53 20 2a 2f  /* NOTRAILERS */
90c0: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
90d0: 20 49 46 46 5f 4e 4f 54 52 41 49 4c 45 52 53 3b   IFF_NOTRAILERS;
90e0: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
90f0: 09 09 09 09 09 63 61 73 65 20 30 78 65 39 37 37  .....case 0xe977
9100: 33 31 34 37 3a 20 2f 2a 20 52 55 4e 4e 49 4e 47  3147: /* RUNNING
9110: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73   */........flags
9120: 20 7c 3d 20 49 46 46 5f 52 55 4e 4e 49 4e 47 3b   |= IFF_RUNNING;
9130: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
9140: 09 09 09 09 09 63 61 73 65 20 30 78 65 39 66 30  .....case 0xe9f0
9150: 36 62 35 30 3a 20 2f 2a 20 4e 4f 41 52 50 20 2a  6b50: /* NOARP *
9160: 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c  /........flags |
9170: 3d 20 49 46 46 5f 4e 4f 41 52 50 3b 0a 09 09 09  = IFF_NOARP;....
9180: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
9190: 09 63 61 73 65 20 30 78 66 39 31 33 32 33 63 33  .case 0xf91323c3
91a0: 3a 20 2f 2a 20 50 52 4f 4d 49 53 43 20 2a 2f 0a  : /* PROMISC */.
91b0: 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20  .......flags |= 
91c0: 49 46 46 5f 50 52 4f 4d 49 53 43 3b 0a 09 09 09  IFF_PROMISC;....
91d0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
91e0: 09 63 61 73 65 20 30 78 39 62 32 61 31 38 34 39  .case 0x9b2a1849
91f0: 3a 20 2f 2a 20 41 4c 4c 4d 55 4c 54 49 20 2a 2f  : /* ALLMULTI */
9200: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
9210: 20 49 46 46 5f 41 4c 4c 4d 55 4c 54 49 3b 0a 09   IFF_ALLMULTI;..
9220: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
9230: 09 09 09 63 61 73 65 20 30 78 31 61 37 34 31 34  ...case 0x1a7414
9240: 64 32 3a 20 2f 2a 20 4d 41 53 54 45 52 20 2a 2f  d2: /* MASTER */
9250: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
9260: 20 49 46 46 5f 4d 41 53 54 45 52 3b 0a 09 09 09   IFF_MASTER;....
9270: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
9280: 09 63 61 73 65 20 30 78 33 39 39 30 36 39 63 35  .case 0x399069c5
9290: 3a 20 2f 2a 20 53 4c 41 56 45 20 2a 2f 0a 09 09  : /* SLAVE */...
92a0: 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 46  .....flags |= IF
92b0: 46 5f 53 4c 41 56 45 3b 0a 09 09 09 09 09 09 09  F_SLAVE;........
92c0: 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 63 61 73  break;.......cas
92d0: 65 20 30 78 34 64 65 39 32 38 64 34 3a 20 2f 2a  e 0x4de928d4: /*
92e0: 20 4d 55 4c 54 49 43 41 53 54 20 2a 2f 0a 09 09   MULTICAST */...
92f0: 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 46  .....flags |= IF
9300: 46 5f 4d 55 4c 54 49 43 41 53 54 3b 0a 09 09 09  F_MULTICAST;....
9310: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
9320: 09 63 61 73 65 20 30 78 32 61 33 35 64 63 34 63  .case 0x2a35dc4c
9330: 3a 20 2f 2a 20 50 4f 52 54 53 45 4c 20 2a 2f 0a  : /* PORTSEL */.
9340: 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20  .......flags |= 
9350: 49 46 46 5f 50 4f 52 54 53 45 4c 3b 0a 09 09 09  IFF_PORTSEL;....
9360: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
9370: 09 63 61 73 65 20 30 78 64 31 38 30 61 63 31 3a  .case 0xd180ac1:
9380: 20 2f 2a 20 41 55 54 4f 4d 45 44 49 41 20 2a 2f   /* AUTOMEDIA */
9390: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
93a0: 20 49 46 46 5f 41 55 54 4f 4d 45 44 49 41 3b 0a   IFF_AUTOMEDIA;.
93b0: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
93c0: 09 09 09 09 63 61 73 65 20 30 78 65 38 62 61 30  ....case 0xe8ba0
93d0: 32 63 33 3a 20 2f 2a 20 44 59 4e 41 4d 49 43 20  2c3: /* DYNAMIC 
93e0: 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20  */........flags 
93f0: 7c 3d 20 49 46 46 5f 44 59 4e 41 4d 49 43 3b 0a  |= IFF_DYNAMIC;.
9400: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
9410: 09 09 09 09 63 61 73 65 20 30 78 31 36 63 38 62  ....case 0x16c8b
9420: 34 64 30 3a 20 2f 2a 20 4c 4f 57 45 52 5f 55 50  4d0: /* LOWER_UP
9430: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73   */........flags
9440: 20 7c 3d 20 49 46 46 5f 4c 4f 57 45 52 5f 55 50   |= IFF_LOWER_UP
9450: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
9460: 09 09 09 09 09 09 63 61 73 65 20 30 78 32 39 33  ......case 0x293
9470: 39 35 39 64 34 3a 20 2f 2a 20 44 4f 52 4d 41 4e  959d4: /* DORMAN
9480: 54 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67  T */........flag
9490: 73 20 7c 3d 20 49 46 46 5f 44 4f 52 4d 41 4e 54  s |= IFF_DORMANT
94a0: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
94b0: 23 69 66 64 65 66 20 49 46 46 5f 45 43 48 4f 0a  #ifdef IFF_ECHO.
94c0: 09 09 09 09 09 09 63 61 73 65 20 30 78 38 62 30  ......case 0x8b0
94d0: 65 34 34 66 3a 20 2f 2a 20 45 43 48 4f 20 2a 2f  e44f: /* ECHO */
94e0: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
94f0: 20 49 46 46 5f 45 43 48 4f 3b 0a 09 09 09 09 09   IFF_ECHO;......
9500: 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
9510: 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
9520: 09 09 69 66 61 63 65 5f 72 65 71 2e 69 66 72 5f  ..iface_req.ifr_
9530: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 0a  flags = flags;..
9540: 09 09 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20  ....ioctl_ret = 
9550: 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 53 49 4f 43  ioctl(sock, SIOC
9560: 53 49 46 46 4c 41 47 53 2c 20 26 69 66 61 63 65  SIFFLAGS, &iface
9570: 5f 72 65 71 29 3b 0a 09 09 09 09 69 66 20 28 69  _req);.....if (i
9580: 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30 29 20 7b  octl_ret != 0) {
9590: 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ......Tcl_SetObj
95a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
95b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
95c0: 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c  strerror(errno),
95d0: 20 2d 31 29 29 3b 0a 0a 09 09 09 09 09 72 65 74   -1));.......ret
95e0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
95f0: 09 09 09 09 7d 0a 0a 09 09 09 09 62 72 65 61 6b  ....}......break
9600: 3b 0a 09 09 09 63 61 73 65 20 30 78 35 65 39 64  ;....case 0x5e9d
9610: 30 33 65 33 3a 20 2f 2a 20 6d 65 74 72 69 63 20  03e3: /* metric 
9620: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 31 62 37  */....case 0x1b7
9630: 61 37 35 3a 20 2f 2a 20 6d 74 75 20 2a 2f 0a 09  a75: /* mtu */..
9640: 09 09 63 61 73 65 20 30 78 37 63 33 38 39 31 66  ..case 0x7c3891f
9650: 32 3a 20 2f 2a 20 68 77 61 64 64 72 20 2a 2f 0a  2: /* hwaddr */.
9660: 09 09 09 63 61 73 65 20 30 78 62 66 37 32 61 39  ...case 0xbf72a9
9670: 36 39 3a 20 2f 2a 20 61 64 64 6d 75 6c 74 69 20  69: /* addmulti 
9680: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 62 61 37  */....case 0xba7
9690: 30 38 39 36 39 3a 20 2f 2a 20 64 65 6c 6d 75 6c  08969: /* delmul
96a0: 74 69 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  ti */....case 0x
96b0: 64 64 38 37 36 65 35 3a 20 2f 2a 20 6e 61 6d 65  dd876e5: /* name
96c0: 20 2a 2f 0a 09 09 09 09 09 54 63 6c 5f 53 65 74   */......Tcl_Set
96d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
96e0: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
96f0: 22 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 75  "option \"%s\" u
9700: 6e 73 75 70 70 6f 72 74 65 64 22 2c 20 54 63 6c  nsupported", Tcl
9710: 5f 47 65 74 53 74 72 69 6e 67 28 6f 70 74 69 6f  _GetString(optio
9720: 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29 3b 0a 0a  n_name_obj)));..
9730: 09 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  .....return(TCL_
9740: 45 52 52 4f 52 29 3b 0a 09 09 09 09 62 72 65 61  ERROR);.....brea
9750: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 34 65 39  k;....case 0x4e9
9760: 61 65 61 66 33 3a 20 2f 2a 20 61 64 64 72 65 73  aeaf3: /* addres
9770: 73 20 2a 2f 0a 09 09 09 09 69 66 20 28 74 6d 70  s */.....if (tmp
9780: 5f 69 6f 63 74 6c 20 3d 3d 20 2d 31 29 20 7b 0a  _ioctl == -1) {.
9790: 09 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c 20 3d  .....tmp_ioctl =
97a0: 20 53 49 4f 43 53 49 46 41 44 44 52 3b 0a 09 09   SIOCSIFADDR;...
97b0: 09 09 09 74 6d 70 5f 69 6f 63 74 6c 5f 61 64 64  ...tmp_ioctl_add
97c0: 72 20 3d 20 26 69 66 61 63 65 5f 72 65 71 2e 69  r = &iface_req.i
97d0: 66 72 5f 61 64 64 72 3b 0a 09 09 09 09 7d 0a 0a  fr_addr;.....}..
97e0: 09 09 09 63 61 73 65 20 30 78 65 63 30 35 37 30  ...case 0xec0570
97f0: 36 65 3a 20 2f 2a 20 64 65 73 74 69 6e 61 74 69  6e: /* destinati
9800: 6f 6e 20 2a 2f 0a 09 09 09 09 69 66 20 28 74 6d  on */.....if (tm
9810: 70 5f 69 6f 63 74 6c 20 3d 3d 20 2d 31 29 20 7b  p_ioctl == -1) {
9820: 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c 20  ......tmp_ioctl 
9830: 3d 20 53 49 4f 43 53 49 46 44 53 54 41 44 44 52  = SIOCSIFDSTADDR
9840: 3b 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c  ;......tmp_ioctl
9850: 5f 61 64 64 72 20 3d 20 26 69 66 61 63 65 5f 72  _addr = &iface_r
9860: 65 71 2e 69 66 72 5f 64 73 74 61 64 64 72 3b 0a  eq.ifr_dstaddr;.
9870: 09 09 09 09 7d 0a 0a 09 09 09 63 61 73 65 20 30  ....}.....case 0
9880: 78 33 65 61 37 65 36 37 34 3a 20 2f 2a 20 62 72  x3ea7e674: /* br
9890: 6f 61 64 63 61 73 74 20 2a 2f 0a 09 09 09 09 69  oadcast */.....i
98a0: 66 20 28 74 6d 70 5f 69 6f 63 74 6c 20 3d 3d 20  f (tmp_ioctl == 
98b0: 2d 31 29 20 7b 0a 09 09 09 09 09 74 6d 70 5f 69  -1) {......tmp_i
98c0: 6f 63 74 6c 20 3d 20 53 49 4f 43 53 49 46 42 52  octl = SIOCSIFBR
98d0: 44 41 44 44 52 3b 0a 09 09 09 09 09 74 6d 70 5f  DADDR;......tmp_
98e0: 69 6f 63 74 6c 5f 61 64 64 72 20 3d 20 26 69 66  ioctl_addr = &if
98f0: 61 63 65 5f 72 65 71 2e 69 66 72 5f 62 72 6f 61  ace_req.ifr_broa
9900: 64 61 64 64 72 3b 0a 09 09 09 09 7d 0a 0a 09 09  daddr;.....}....
9910: 09 63 61 73 65 20 30 78 34 64 36 35 65 65 36 62  .case 0x4d65ee6b
9920: 3a 20 2f 2a 20 6e 65 74 6d 61 73 6b 20 2a 2f 0a  : /* netmask */.
9930: 09 09 09 09 69 66 20 28 74 6d 70 5f 69 6f 63 74  ....if (tmp_ioct
9940: 6c 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 09 09  l == -1) {......
9950: 74 6d 70 5f 69 6f 63 74 6c 20 3d 20 53 49 4f 43  tmp_ioctl = SIOC
9960: 53 49 46 4e 45 54 4d 41 53 4b 3b 0a 09 09 09 09  SIFNETMASK;.....
9970: 09 74 6d 70 5f 69 6f 63 74 6c 5f 61 64 64 72 20  .tmp_ioctl_addr 
9980: 3d 20 26 69 66 61 63 65 5f 72 65 71 2e 69 66 72  = &iface_req.ifr
9990: 5f 6e 65 74 6d 61 73 6b 3b 0a 09 09 09 09 7d 0a  _netmask;.....}.
99a0: 0a 09 09 09 09 70 61 72 73 65 5f 72 65 74 20 3d  .....parse_ret =
99b0: 20 74 75 61 70 69 5f 70 72 69 76 61 74 65 5f 67   tuapi_private_g
99c0: 65 74 5f 73 6f 63 6b 61 64 64 72 5f 66 72 6f 6d  et_sockaddr_from
99d0: 5f 6f 62 6a 28 6f 70 74 69 6f 6e 5f 76 61 6c 5f  _obj(option_val_
99e0: 6f 62 6a 2c 20 74 6d 70 5f 69 6f 63 74 6c 5f 61  obj, tmp_ioctl_a
99f0: 64 64 72 29 3b 0a 09 09 09 09 69 66 20 28 70 61  ddr);.....if (pa
9a00: 72 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  rse_ret != 0) {.
9a10: 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52  .....Tcl_SetObjR
9a20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
9a30: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e 61  l_ObjPrintf("una
9a40: 62 6c 65 20 74 6f 20 70 61 72 73 65 20 5c 22 25  ble to parse \"%
9a50: 73 5c 22 20 61 73 20 61 6e 20 61 64 64 72 65 73  s\" as an addres
9a60: 73 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s", Tcl_GetStrin
9a70: 67 28 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a  g(option_val_obj
9a80: 29 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  )));.......retur
9a90: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  n(TCL_ERROR);...
9aa0: 09 09 7d 0a 0a 09 09 09 09 73 77 69 74 63 68 20  ..}......switch 
9ab0: 28 74 6d 70 5f 69 6f 63 74 6c 5f 61 64 64 72 2d  (tmp_ioctl_addr-
9ac0: 3e 73 61 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09  >sa_family) {...
9ad0: 09 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 3a  ...case AF_INET:
9ae0: 0a 09 09 09 09 09 09 74 6d 70 5f 73 6f 63 6b 20  .......tmp_sock 
9af0: 3d 20 73 6f 63 6b 5f 76 34 3b 0a 0a 09 09 09 09  = sock_v4;......
9b00: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
9b10: 73 65 20 41 46 5f 49 4e 45 54 36 3a 0a 09 09 09  se AF_INET6:....
9b20: 09 09 09 74 6d 70 5f 73 6f 63 6b 20 3d 20 73 6f  ...tmp_sock = so
9b30: 63 6b 5f 76 36 3b 0a 0a 09 09 09 09 09 09 62 72  ck_v6;........br
9b40: 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75 6c  eak;......defaul
9b50: 74 3a 0a 09 09 09 09 09 09 54 63 6c 5f 53 65 74  t:.......Tcl_Set
9b60: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9b70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
9b80: 62 6a 28 22 75 6e 61 62 6c 65 20 74 6f 20 64 65  bj("unable to de
9b90: 74 65 72 6d 69 6e 65 20 61 64 64 72 65 73 73 20  termine address 
9ba0: 66 61 6d 69 6c 79 20 6f 66 20 73 6f 63 6b 61 64  family of sockad
9bb0: 64 72 22 2c 20 2d 31 29 29 3b 0a 09 09 09 09 09  dr", -1));......
9bc0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
9bd0: 52 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  R);.....}......i
9be0: 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c  octl_ret = ioctl
9bf0: 28 74 6d 70 5f 73 6f 63 6b 2c 20 74 6d 70 5f 69  (tmp_sock, tmp_i
9c00: 6f 63 74 6c 2c 20 26 69 66 61 63 65 5f 72 65 71  octl, &iface_req
9c10: 29 3b 0a 09 09 09 09 69 66 20 28 69 6f 63 74 6c  );.....if (ioctl
9c20: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
9c30: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
9c40: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
9c50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74 72 65  ewStringObj(stre
9c60: 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29  rror(errno), -1)
9c70: 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
9c80: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 09  TCL_ERROR);.....
9c90: 7d 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  }......break;...
9ca0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 54 63  .default:.....Tc
9cb0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
9cc0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
9cd0: 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70  intf("unknown op
9ce0: 74 69 6f 6e 20 5c 22 25 73 5c 22 22 2c 20 54 63  tion \"%s\"", Tc
9cf0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 70 74 69  l_GetString(opti
9d00: 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29 3b 0a  on_name_obj)));.
9d10: 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  .....return(TCL_
9d20: 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  ERROR);...}..}..
9d30: 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
9d40: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
9d50: 75 61 70 69 5f 69 66 63 6f 6e 66 69 67 28 43 6c  uapi_ifconfig(Cl
9d60: 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c  ientData cd, Tcl
9d70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9d80: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
9d90: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
9da0: 29 20 7b 0a 09 69 6e 74 20 73 6f 63 6b 5f 76 34  ) {..int sock_v4
9db0: 2c 20 73 6f 63 6b 5f 76 36 2c 20 73 6f 63 6b 3b  , sock_v6, sock;
9dc0: 0a 09 69 6e 74 20 72 65 74 76 61 6c 20 3d 20 54  ..int retval = T
9dd0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 09 73 6f 63 6b  CL_ERROR;...sock
9de0: 20 3d 20 74 75 61 70 69 5f 69 6e 74 65 72 6e 61   = tuapi_interna
9df0: 6c 5f 67 65 74 73 6f 63 6b 28 26 73 6f 63 6b 5f  l_getsock(&sock_
9e00: 76 34 2c 20 26 73 6f 63 6b 5f 76 36 29 3b 0a 09  v4, &sock_v6);..
9e10: 69 66 20 28 73 6f 63 6b 20 3d 3d 20 2d 31 29 20  if (sock == -1) 
9e20: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
9e30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
9e40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75  _NewStringObj("u
9e50: 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  nable to create 
9e60: 73 6f 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 0a  socket", -1));..
9e70: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
9e80: 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
9e90: 20 28 6f 62 6a 63 29 20 7b 0a 09 09 63 61 73 65   (objc) {...case
9ea0: 20 30 3a 0a 09 09 63 61 73 65 20 31 3a 20 2f 2a   0:...case 1: /*
9eb0: 20 4e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 6c   No arguments, l
9ec0: 69 73 74 20 61 6c 6c 20 69 6e 74 65 72 66 61 63  ist all interfac
9ed0: 65 73 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20  es */....retval 
9ee0: 3d 20 74 75 61 70 69 5f 69 66 63 6f 6e 66 69 67  = tuapi_ifconfig
9ef0: 5f 6c 69 73 74 28 63 64 2c 20 69 6e 74 65 72 70  _list(cd, interp
9f00: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f  , objc, objv, so
9f10: 63 6b 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ck);.....break;.
9f20: 09 09 63 61 73 65 20 32 3a 20 2f 2a 20 4f 6e 65  ..case 2: /* One
9f30: 20 61 72 67 75 6d 65 6e 74 2c 20 67 69 76 65 20   argument, give 
9f40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
9f50: 74 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20  t the interface 
9f60: 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 74  */....retval = t
9f70: 75 61 70 69 5f 69 66 63 6f 6e 66 69 67 5f 69 6e  uapi_ifconfig_in
9f80: 66 6f 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 6f  fo(cd, interp, o
9f90: 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63 6b 2c  bjc, objv, sock,
9fa0: 20 73 6f 63 6b 5f 76 34 2c 20 73 6f 63 6b 5f 76   sock_v4, sock_v
9fb0: 36 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  6);.....break;..
9fc0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 2f 2a 20  .default:..../* 
9fd0: 4f 74 68 65 72 77 69 73 65 2c 20 63 6f 6e 66 69  Otherwise, confi
9fe0: 67 75 72 65 20 74 68 65 20 69 6e 74 65 72 61 63  gure the interac
9ff0: 65 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d  e */....retval =
a000: 20 74 75 61 70 69 5f 69 66 63 6f 6e 66 69 67 5f   tuapi_ifconfig_
a010: 63 6f 6e 66 28 63 64 2c 20 69 6e 74 65 72 70 2c  conf(cd, interp,
a020: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63   objc, objv, soc
a030: 6b 2c 20 73 6f 63 6b 5f 76 34 2c 20 73 6f 63 6b  k, sock_v4, sock
a040: 5f 76 36 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  _v6);.....break;
a050: 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 6e 75 70  ..}.../* Cleanup
a060: 20 2a 2f 0a 09 69 66 20 28 73 6f 63 6b 5f 76 34   */..if (sock_v4
a070: 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 73   != -1) {...clos
a080: 65 28 73 6f 63 6b 5f 76 34 29 3b 0a 09 7d 0a 0a  e(sock_v4);..}..
a090: 09 69 66 20 28 73 6f 63 6b 5f 76 36 20 21 3d 20  .if (sock_v6 != 
a0a0: 2d 31 29 20 7b 0a 09 09 63 6c 6f 73 65 28 73 6f  -1) {...close(so
a0b0: 63 6b 5f 76 36 29 3b 0a 09 7d 0a 0a 09 72 65 74  ck_v6);..}...ret
a0c0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
a0d0: 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69  static int tuapi
a0e0: 5f 72 6f 75 74 65 5f 6c 69 73 74 28 43 6c 69 65  _route_list(Clie
a0f0: 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49  ntData cd, Tcl_I
a100: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
a110: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
a120: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c 20   *CONST objv[], 
a130: 69 6e 74 20 73 6f 63 6b 5f 76 34 2c 20 69 6e 74  int sock_v4, int
a140: 20 73 6f 63 6b 5f 76 36 29 20 7b 0a 09 54 63 6c   sock_v6) {..Tcl
a150: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
a160: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
a170: 69 6e 67 4f 62 6a 28 22 6e 6f 74 20 69 6d 70 6c  ingObj("not impl
a180: 65 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29 3b 0a  emented", -1));.
a190: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
a1a0: 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OR);.}..static i
a1b0: 6e 74 20 74 75 61 70 69 5f 72 6f 75 74 65 5f 63  nt tuapi_route_c
a1c0: 6f 6e 66 28 43 6c 69 65 6e 74 44 61 74 61 20 63  onf(ClientData c
a1d0: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
a1e0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
a1f0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
a200: 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73 6f 63 6b  objv[], int sock
a210: 5f 76 34 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 36  _v4, int sock_v6
a220: 29 20 7b 0a 09 54 63 6c 5f 57 69 64 65 49 6e 74  ) {..Tcl_WideInt
a230: 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f 77 69 64 65   option_val_wide
a240: 3b 20 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 70 65  ; ..Tcl_Obj *ope
a250: 72 61 74 69 6f 6e 5f 6f 62 6a 2c 20 2a 64 65 73  ration_obj, *des
a260: 74 5f 6f 62 6a 2c 20 2a 64 65 73 74 6d 61 73 6b  t_obj, *destmask
a270: 5f 6f 62 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  _obj;..Tcl_Obj *
a280: 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 2c  option_name_obj,
a290: 20 2a 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a   *option_val_obj
a2a0: 3b 0a 09 73 74 72 75 63 74 20 72 74 65 6e 74 72  ;..struct rtentr
a2b0: 79 20 72 6f 75 74 65 3b 0a 09 69 6e 74 20 73 6f  y route;..int so
a2c0: 63 6b 3b 0a 09 69 6e 74 20 69 6f 63 74 6c 5f 69  ck;..int ioctl_i
a2d0: 64 3b 0a 09 69 6e 74 20 74 63 6c 5f 72 65 74 2c  d;..int tcl_ret,
a2e0: 20 69 6f 63 74 6c 5f 72 65 74 2c 20 70 61 72 73   ioctl_ret, pars
a2f0: 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a  e_ret;...if (obj
a300: 63 20 3c 20 34 29 20 7b 0a 09 09 54 63 6c 5f 53  c < 4) {...Tcl_S
a310: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a320: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
a330: 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72  gObj("wrong # ar
a340: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a350: 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c  ::tuapi::syscall
a360: 3a 3a 72 6f 75 74 65 20 6f 70 65 72 61 74 69 6f  ::route operatio
a370: 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 65  n destination de
a380: 73 74 69 6e 61 74 69 6f 6e 5f 6d 61 73 6b 20 3f  stination_mask ?
a390: 6f 70 74 69 6f 6e 73 3f 5c 22 22 2c 20 2d 31 29  options?\"", -1)
a3a0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c  );....return(TCL
a3b0: 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
a3c0: 20 43 6c 65 61 72 20 6f 62 6a 65 63 74 20 76 61   Clear object va
a3d0: 6c 75 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28  lues */..memset(
a3e0: 26 72 6f 75 74 65 2c 20 30 2c 20 73 69 7a 65 6f  &route, 0, sizeo
a3f0: 66 28 72 6f 75 74 65 29 29 3b 0a 0a 09 2f 2a 20  f(route));.../* 
a400: 44 65 74 65 72 6d 69 6e 65 20 6f 70 65 72 61 74  Determine operat
a410: 69 6f 6e 20 2a 2f 0a 09 6f 70 65 72 61 74 69 6f  ion */..operatio
a420: 6e 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b  n_obj = objv[1];
a430: 0a 09 73 77 69 74 63 68 20 28 74 75 61 70 69 5f  ..switch (tuapi_
a440: 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68  internal_simpleh
a450: 61 73 68 5f 6f 62 6a 28 6f 70 65 72 61 74 69 6f  ash_obj(operatio
a460: 6e 5f 6f 62 6a 29 29 20 7b 0a 09 09 63 61 73 65  n_obj)) {...case
a470: 20 30 78 31 38 37 32 36 34 3a 20 2f 2a 20 61 64   0x187264: /* ad
a480: 64 20 2a 2f 0a 09 09 09 69 6f 63 74 6c 5f 69 64  d */....ioctl_id
a490: 20 3d 20 53 49 4f 43 41 44 44 52 54 3b 0a 09 09   = SIOCADDRT;...
a4a0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 30  .break;...case 0
a4b0: 78 31 39 33 32 65 63 3a 20 2f 2a 20 64 65 6c 20  x1932ec: /* del 
a4c0: 2a 2f 0a 09 09 63 61 73 65 20 30 78 35 64 39 38  */...case 0x5d98
a4d0: 65 39 36 35 3a 20 2f 2a 20 64 65 6c 65 74 65 20  e965: /* delete 
a4e0: 2a 2f 0a 09 09 09 69 6f 63 74 6c 5f 69 64 20 3d  */....ioctl_id =
a4f0: 20 53 49 4f 43 44 45 4c 52 54 3b 0a 09 09 09 62   SIOCDELRT;....b
a500: 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a  reak;...default:
a510: 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ....Tcl_SetObjRe
a520: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
a530: 5f 4f 62 6a 50 72 69 6e 74 66 28 22 62 61 64 20  _ObjPrintf("bad 
a540: 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 3a 20 6d  option \"%s\": m
a550: 75 73 74 20 62 65 20 61 64 64 2c 20 6f 72 20 64  ust be add, or d
a560: 65 6c 65 74 65 22 2c 20 54 63 6c 5f 47 65 74 53  elete", Tcl_GetS
a570: 74 72 69 6e 67 28 6f 70 65 72 61 74 69 6f 6e 5f  tring(operation_
a580: 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 72 65 74 75  obj)));.....retu
a590: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
a5a0: 7d 0a 0a 09 2f 2a 20 53 65 74 20 64 65 66 61 75  }.../* Set defau
a5b0: 6c 74 20 66 6c 61 67 73 20 2a 2f 0a 09 72 6f 75  lt flags */..rou
a5c0: 74 65 2e 72 74 5f 66 6c 61 67 73 20 3d 20 52 54  te.rt_flags = RT
a5d0: 46 5f 55 50 3b 0a 0a 09 2f 2a 20 50 61 72 73 65  F_UP;.../* Parse
a5e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 64 64   destination add
a5f0: 72 65 73 73 20 2a 2f 0a 09 64 65 73 74 5f 6f 62  ress */..dest_ob
a600: 6a 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 70 61  j = objv[2];..pa
a610: 72 73 65 5f 72 65 74 20 3d 20 74 75 61 70 69 5f  rse_ret = tuapi_
a620: 70 72 69 76 61 74 65 5f 67 65 74 5f 73 6f 63 6b  private_get_sock
a630: 61 64 64 72 5f 66 72 6f 6d 5f 6f 62 6a 28 64 65  addr_from_obj(de
a640: 73 74 5f 6f 62 6a 2c 20 26 72 6f 75 74 65 2e 72  st_obj, &route.r
a650: 74 5f 64 73 74 29 3b 0a 09 69 66 20 28 70 61 72  t_dst);..if (par
a660: 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  se_ret != 0) {..
a670: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
a680: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
a690: 6a 50 72 69 6e 74 66 28 22 75 6e 61 62 6c 65 20  jPrintf("unable 
a6a0: 74 6f 20 70 61 72 73 65 20 5c 22 25 73 5c 22 20  to parse \"%s\" 
a6b0: 61 73 20 61 6e 20 61 64 64 72 65 73 73 22 2c 20  as an address", 
a6c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 64 65  Tcl_GetString(de
a6d0: 73 74 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 72 65  st_obj)));....re
a6e0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
a6f0: 0a 09 7d 0a 0a 09 2f 2a 20 50 61 72 73 65 20 64  ..}.../* Parse d
a700: 65 73 74 69 6e 61 74 69 6f 6e 20 6e 65 74 6d 61  estination netma
a710: 73 6b 20 2a 2f 0a 09 64 65 73 74 6d 61 73 6b 5f  sk */..destmask_
a720: 6f 62 6a 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 09  obj = objv[3];..
a730: 70 61 72 73 65 5f 72 65 74 20 3d 20 74 75 61 70  parse_ret = tuap
a740: 69 5f 70 72 69 76 61 74 65 5f 67 65 74 5f 73 6f  i_private_get_so
a750: 63 6b 61 64 64 72 5f 66 72 6f 6d 5f 6f 62 6a 28  ckaddr_from_obj(
a760: 64 65 73 74 6d 61 73 6b 5f 6f 62 6a 2c 20 26 72  destmask_obj, &r
a770: 6f 75 74 65 2e 72 74 5f 67 65 6e 6d 61 73 6b 29  oute.rt_genmask)
a780: 3b 0a 09 69 66 20 28 70 61 72 73 65 5f 72 65 74  ;..if (parse_ret
a790: 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53   != 0) {...Tcl_S
a7a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a7b0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
a7c0: 66 28 22 75 6e 61 62 6c 65 20 74 6f 20 70 61 72  f("unable to par
a7d0: 73 65 20 5c 22 25 73 5c 22 20 61 73 20 61 6e 20  se \"%s\" as an 
a7e0: 61 64 64 72 65 73 73 22 2c 20 54 63 6c 5f 47 65  address", Tcl_Ge
a7f0: 74 53 74 72 69 6e 67 28 64 65 73 74 6d 61 73 6b  tString(destmask
a800: 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 72 65 74 75  _obj)));....retu
a810: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
a820: 7d 0a 0a 09 69 66 20 28 72 6f 75 74 65 2e 72 74  }...if (route.rt
a830: 5f 64 73 74 2e 73 61 5f 66 61 6d 69 6c 79 20 21  _dst.sa_family !
a840: 3d 20 72 6f 75 74 65 2e 72 74 5f 67 65 6e 6d 61  = route.rt_genma
a850: 73 6b 2e 73 61 5f 66 61 6d 69 6c 79 29 20 7b 0a  sk.sa_family) {.
a860: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
a870: 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 20 20 54  lt(interp,...  T
a880: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 64 65  cl_ObjPrintf("de
a890: 73 74 69 6e 61 74 69 6f 6e 20 28 5c 22 25 73 5c  stination (\"%s\
a8a0: 22 29 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ") and destinati
a8b0: 6f 6e 5f 6d 61 73 6b 20 28 5c 22 25 73 5c 22 29  on_mask (\"%s\")
a8c0: 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
a8d0: 6c 61 73 73 65 73 22 2c 0a 09 09 20 20 20 20 54  lasses",...    T
a8e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 64 65 73  cl_GetString(des
a8f0: 74 5f 6f 62 6a 29 2c 0a 09 09 20 20 20 20 54 63  t_obj),...    Tc
a900: 6c 5f 47 65 74 53 74 72 69 6e 67 28 64 65 73 74  l_GetString(dest
a910: 6d 61 73 6b 5f 6f 62 6a 29 0a 09 09 20 20 29 0a  mask_obj)...  ).
a920: 09 09 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54  ..);....return(T
a930: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  CL_ERROR);..}...
a940: 73 77 69 74 63 68 20 28 72 6f 75 74 65 2e 72 74  switch (route.rt
a950: 5f 64 73 74 2e 73 61 5f 66 61 6d 69 6c 79 29 20  _dst.sa_family) 
a960: 7b 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54  {...case AF_INET
a970: 3a 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 09 09 09  : /* IPv4 */....
a980: 69 66 20 28 73 6f 63 6b 5f 76 34 20 3d 3d 20 2d  if (sock_v4 == -
a990: 31 29 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74  1) {.....Tcl_Set
a9a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
a9b0: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
a9c0: 22 61 64 64 72 65 73 73 20 5c 22 25 73 5c 22 20  "address \"%s\" 
a9d0: 69 73 20 49 50 76 34 2c 20 62 75 74 20 75 6e 61  is IPv4, but una
a9e0: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 49 50  ble to create IP
a9f0: 76 34 20 73 6f 63 6b 65 74 22 2c 20 54 63 6c 5f  v4 socket", Tcl_
aa00: 47 65 74 53 74 72 69 6e 67 28 64 65 73 74 5f 6f  GetString(dest_o
aa10: 62 6a 29 29 29 3b 0a 0a 09 09 09 09 72 65 74 75  bj)));......retu
aa20: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
aa30: 09 09 7d 0a 0a 09 09 09 69 66 20 28 28 28 73 74  ..}.....if (((st
aa40: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
aa50: 20 2a 29 20 26 72 6f 75 74 65 2e 72 74 5f 67 65   *) &route.rt_ge
aa60: 6e 6d 61 73 6b 29 2d 3e 73 69 6e 5f 61 64 64 72  nmask)->sin_addr
aa70: 2e 73 5f 61 64 64 72 20 3d 3d 20 49 4e 41 44 44  .s_addr == INADD
aa80: 52 5f 42 52 4f 41 44 43 41 53 54 29 20 7b 0a 09  R_BROADCAST) {..
aa90: 09 09 09 72 6f 75 74 65 2e 72 74 5f 66 6c 61 67  ...route.rt_flag
aaa0: 73 20 7c 3d 20 52 54 46 5f 48 4f 53 54 3b 0a 09  s |= RTF_HOST;..
aab0: 09 09 7d 0a 0a 09 09 09 73 6f 63 6b 20 3d 20 73  ..}.....sock = s
aac0: 6f 63 6b 5f 76 34 3b 0a 0a 09 09 09 62 72 65 61  ock_v4;.....brea
aad0: 6b 3b 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45  k;...case AF_INE
aae0: 54 36 3a 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 09  T6: /* IPv6 */..
aaf0: 09 09 69 66 20 28 73 6f 63 6b 5f 76 36 20 3d 3d  ..if (sock_v6 ==
ab00: 20 2d 31 29 20 7b 0a 09 09 09 09 54 63 6c 5f 53   -1) {.....Tcl_S
ab10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ab20: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
ab30: 66 28 22 61 64 64 72 65 73 73 20 5c 22 25 73 5c  f("address \"%s\
ab40: 22 20 69 73 20 49 50 76 36 2c 20 62 75 74 20 75  " is IPv6, but u
ab50: 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  nable to create 
ab60: 49 50 76 36 20 73 6f 63 6b 65 74 22 2c 20 54 63  IPv6 socket", Tc
ab70: 6c 5f 47 65 74 53 74 72 69 6e 67 28 64 65 73 74  l_GetString(dest
ab80: 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 09 72 65  _obj)));......re
ab90: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
aba0: 0a 09 09 09 7d 0a 0a 09 09 09 73 6f 63 6b 20 3d  ....}.....sock =
abb0: 20 73 6f 63 6b 5f 76 36 3b 0a 0a 09 09 09 62 72   sock_v6;.....br
abc0: 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a  eak;...default:.
abd0: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
abe0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
abf0: 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e 61 62 6c  ObjPrintf("unabl
ac00: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
ac10: 79 70 65 20 6f 66 20 61 64 64 72 65 73 73 20 66  ype of address f
ac20: 6f 72 20 5c 22 25 73 5c 22 22 2c 20 54 63 6c 5f  or \"%s\"", Tcl_
ac30: 47 65 74 53 74 72 69 6e 67 28 64 65 73 74 5f 6f  GetString(dest_o
ac40: 62 6a 29 29 29 3b 0a 0a 09 09 09 72 65 74 75 72  bj)));.....retur
ac50: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
ac60: 0a 0a 09 2f 2a 20 50 61 72 73 65 20 72 65 6d 61  .../* Parse rema
ac70: 69 6e 69 6e 67 20 6f 70 74 69 6f 6e 73 20 2a 2f  ining options */
ac80: 0a 09 6f 62 6a 63 20 2d 3d 20 34 3b 0a 09 6f 62  ..objc -= 4;..ob
ac90: 6a 76 20 2b 3d 20 34 3b 0a 0a 09 66 6f 72 20 28  jv += 4;...for (
aca0: 3b 20 6f 62 6a 63 20 3e 20 30 3b 20 6f 62 6a 63  ; objc > 0; objc
acb0: 2d 2d 2c 6f 62 6a 76 2b 2b 29 20 7b 0a 09 09 6f  --,objv++) {...o
acc0: 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 20 3d  ption_name_obj =
acd0: 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 09 09 69 66 20   objv[0];....if 
ace0: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 09 09  (objc < 2) {....
acf0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
ad00: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
ad10: 50 72 69 6e 74 66 28 22 6f 70 74 69 6f 6e 20 5c  Printf("option \
ad20: 22 25 73 5c 22 20 72 65 71 75 69 72 65 73 20 61  "%s\" requires a
ad30: 6e 20 61 72 67 75 6d 65 6e 74 22 2c 20 54 63 6c  n argument", Tcl
ad40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 70 74 69 6f  _GetString(optio
ad50: 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29 3b 0a 0a  n_name_obj)));..
ad60: 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
ad70: 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 6f 62 6a  ROR);...}....obj
ad80: 63 2d 2d 3b 0a 09 09 6f 62 6a 76 2b 2b 3b 0a 0a  c--;...objv++;..
ad90: 09 09 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a  ..option_val_obj
ada0: 20 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 09 09 73   = objv[0];....s
adb0: 77 69 74 63 68 20 28 74 75 61 70 69 5f 69 6e 74  witch (tuapi_int
adc0: 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68 61 73 68  ernal_simplehash
add0: 5f 6f 62 6a 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65  _obj(option_name
ade0: 5f 6f 62 6a 29 29 20 7b 0a 09 09 09 63 61 73 65  _obj)) {....case
adf0: 20 30 78 34 63 37 32 37 37 37 39 3a 20 2f 2a 20   0x4c727779: /* 
ae00: 67 61 74 65 77 61 79 20 2a 2f 0a 09 09 09 09 70  gateway */.....p
ae10: 61 72 73 65 5f 72 65 74 20 3d 20 74 75 61 70 69  arse_ret = tuapi
ae20: 5f 70 72 69 76 61 74 65 5f 67 65 74 5f 73 6f 63  _private_get_soc
ae30: 6b 61 64 64 72 5f 66 72 6f 6d 5f 6f 62 6a 28 6f  kaddr_from_obj(o
ae40: 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a 2c 20 26  ption_val_obj, &
ae50: 72 6f 75 74 65 2e 72 74 5f 67 61 74 65 77 61 79  route.rt_gateway
ae60: 29 3b 0a 09 09 09 09 69 66 20 28 70 61 72 73 65  );.....if (parse
ae70: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
ae80: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
ae90: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
aea0: 62 6a 50 72 69 6e 74 66 28 22 75 6e 61 62 6c 65  bjPrintf("unable
aeb0: 20 74 6f 20 70 61 72 73 65 20 5c 22 25 73 5c 22   to parse \"%s\"
aec0: 20 61 73 20 61 6e 20 61 64 64 72 65 73 73 22 2c   as an address",
aed0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
aee0: 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a 29 29 29  ption_val_obj)))
aef0: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 54  ;.......return(T
af00: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 09 7d  CL_ERROR);.....}
af10: 0a 0a 09 09 09 09 72 6f 75 74 65 2e 72 74 5f 66  ......route.rt_f
af20: 6c 61 67 73 20 26 3d 20 28 7e 52 54 46 5f 48 4f  lags &= (~RTF_HO
af30: 53 54 29 3b 0a 09 09 09 09 72 6f 75 74 65 2e 72  ST);.....route.r
af40: 74 5f 66 6c 61 67 73 20 7c 3d 20 52 54 46 5f 47  t_flags |= RTF_G
af50: 41 54 45 57 41 59 3b 0a 0a 09 09 09 09 62 72 65  ATEWAY;......bre
af60: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 31 62  ak;....case 0x1b
af70: 37 61 37 35 3a 20 2f 2a 20 6d 74 75 20 2a 2f 0a  7a75: /* mtu */.
af80: 09 09 09 09 74 63 6c 5f 72 65 74 20 3d 20 54 63  ....tcl_ret = Tc
af90: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
afa0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 70 74 69  Obj(interp, opti
afb0: 6f 6e 5f 76 61 6c 5f 6f 62 6a 2c 20 26 6f 70 74  on_val_obj, &opt
afc0: 69 6f 6e 5f 76 61 6c 5f 77 69 64 65 29 3b 0a 09  ion_val_wide);..
afd0: 09 09 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21  ...if (tcl_ret !
afe0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 09  = TCL_OK) {.....
aff0: 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29  .return(tcl_ret)
b000: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 72 6f 75  ;.....}......rou
b010: 74 65 2e 72 74 5f 66 6c 61 67 73 20 7c 3d 20 52  te.rt_flags |= R
b020: 54 46 5f 4d 54 55 3b 0a 09 09 09 09 72 6f 75 74  TF_MTU;.....rout
b030: 65 2e 72 74 5f 6d 74 75 20 3d 20 6f 70 74 69 6f  e.rt_mtu = optio
b040: 6e 5f 76 61 6c 5f 77 69 64 65 3b 0a 0a 09 09 09  n_val_wide;.....
b050: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
b060: 30 78 35 65 39 64 30 33 65 33 3a 20 2f 2a 20 6d  0x5e9d03e3: /* m
b070: 65 74 72 69 63 20 2a 2f 0a 09 09 09 09 74 63 6c  etric */.....tcl
b080: 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 57 69  _ret = Tcl_GetWi
b090: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
b0a0: 65 72 70 2c 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f  erp, option_val_
b0b0: 6f 62 6a 2c 20 26 6f 70 74 69 6f 6e 5f 76 61 6c  obj, &option_val
b0c0: 5f 77 69 64 65 29 3b 0a 09 09 09 09 69 66 20 28  _wide);.....if (
b0d0: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
b0e0: 4b 29 20 7b 0a 09 09 09 09 09 72 65 74 75 72 6e  K) {......return
b0f0: 28 74 63 6c 5f 72 65 74 29 3b 0a 09 09 09 09 7d  (tcl_ret);.....}
b100: 0a 0a 09 09 09 09 72 6f 75 74 65 2e 72 74 5f 6d  ......route.rt_m
b110: 65 74 72 69 63 20 3d 20 6f 70 74 69 6f 6e 5f 76  etric = option_v
b120: 61 6c 5f 77 69 64 65 3b 0a 0a 09 09 09 09 62 72  al_wide;......br
b130: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 39  eak;....case 0x9
b140: 64 64 38 65 38 66 37 3a 20 2f 2a 20 77 69 6e 64  dd8e8f7: /* wind
b150: 6f 77 20 2a 2f 0a 09 09 09 09 74 63 6c 5f 72 65  ow */.....tcl_re
b160: 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49  t = Tcl_GetWideI
b170: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b180: 2c 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a  , option_val_obj
b190: 2c 20 26 6f 70 74 69 6f 6e 5f 76 61 6c 5f 77 69  , &option_val_wi
b1a0: 64 65 29 3b 0a 09 09 09 09 69 66 20 28 74 63 6c  de);.....if (tcl
b1b0: 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  _ret != TCL_OK) 
b1c0: 7b 0a 09 09 09 09 09 72 65 74 75 72 6e 28 74 63  {......return(tc
b1d0: 6c 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  l_ret);.....}...
b1e0: 09 09 09 72 6f 75 74 65 2e 72 74 5f 66 6c 61 67  ...route.rt_flag
b1f0: 73 20 7c 3d 20 52 54 46 5f 57 49 4e 44 4f 57 3b  s |= RTF_WINDOW;
b200: 0a 09 09 09 09 72 6f 75 74 65 2e 72 74 5f 77 69  .....route.rt_wi
b210: 6e 64 6f 77 20 3d 20 6f 70 74 69 6f 6e 5f 76 61  ndow = option_va
b220: 6c 5f 77 69 64 65 3b 0a 0a 09 09 09 09 62 72 65  l_wide;......bre
b230: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 31 39  ak;....case 0x19
b240: 33 32 66 36 3a 20 2f 2a 20 64 65 76 20 2a 2f 0a  32f6: /* dev */.
b250: 09 09 09 63 61 73 65 20 30 78 35 65 64 62 65 32  ...case 0x5edbe2
b260: 65 35 3a 20 2f 2a 20 64 65 76 69 63 65 20 2a 2f  e5: /* device */
b270: 0a 09 09 09 09 72 6f 75 74 65 2e 72 74 5f 64 65  .....route.rt_de
b280: 76 20 3d 20 73 74 72 64 75 70 28 54 63 6c 5f 47  v = strdup(Tcl_G
b290: 65 74 53 74 72 69 6e 67 28 6f 70 74 69 6f 6e 5f  etString(option_
b2a0: 76 61 6c 5f 6f 62 6a 29 29 3b 0a 0a 09 09 09 09  val_obj));......
b2b0: 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
b2c0: 74 3a 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62  t:.....Tcl_SetOb
b2d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
b2e0: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 62  Tcl_ObjPrintf("b
b2f0: 61 64 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  ad option \"%s\"
b300: 3a 20 6d 75 73 74 20 62 65 20 67 61 74 65 77 61  : must be gatewa
b310: 79 2c 20 6d 74 75 2c 20 6d 65 74 72 69 63 2c 20  y, mtu, metric, 
b320: 64 65 76 69 63 65 2c 20 6f 72 20 77 69 6e 64 6f  device, or windo
b330: 77 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  w", Tcl_GetStrin
b340: 67 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62  g(option_name_ob
b350: 6a 29 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  j)));......retur
b360: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  n(TCL_ERROR);...
b370: 7d 0a 09 7d 0a 0a 09 2f 2a 20 52 65 71 75 65 73  }..}.../* Reques
b380: 74 20 72 6f 75 74 65 20 63 68 61 6e 67 65 20 2a  t route change *
b390: 2f 0a 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69  /..ioctl_ret = i
b3a0: 6f 63 74 6c 28 73 6f 63 6b 2c 20 69 6f 63 74 6c  octl(sock, ioctl
b3b0: 5f 69 64 2c 20 26 72 6f 75 74 65 29 3b 0a 09 69  _id, &route);..i
b3c0: 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20  f (ioctl_ret != 
b3d0: 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  0) {...Tcl_SetOb
b3e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
b3f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b400: 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29  (strerror(errno)
b410: 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72  , -1));....retur
b420: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
b430: 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b  ...return(TCL_OK
b440: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
b450: 20 74 75 61 70 69 5f 72 6f 75 74 65 28 43 6c 69   tuapi_route(Cli
b460: 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f  entData cd, Tcl_
b470: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b480: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
b490: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29  j *CONST objv[])
b4a0: 20 7b 0a 09 69 6e 74 20 73 6f 63 6b 5f 76 34 2c   {..int sock_v4,
b4b0: 20 73 6f 63 6b 5f 76 36 2c 20 73 6f 63 6b 3b 0a   sock_v6, sock;.
b4c0: 09 69 6e 74 20 72 65 74 76 61 6c 20 3d 20 54 43  .int retval = TC
b4d0: 4c 5f 45 52 52 4f 52 3b 0a 0a 09 73 6f 63 6b 20  L_ERROR;...sock 
b4e0: 3d 20 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c  = tuapi_internal
b4f0: 5f 67 65 74 73 6f 63 6b 28 26 73 6f 63 6b 5f 76  _getsock(&sock_v
b500: 34 2c 20 26 73 6f 63 6b 5f 76 36 29 3b 0a 09 69  4, &sock_v6);..i
b510: 66 20 28 73 6f 63 6b 20 3d 3d 20 2d 31 29 20 7b  f (sock == -1) {
b520: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
b530: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b540: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e  NewStringObj("un
b550: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 73  able to create s
b560: 6f 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 0a 09  ocket", -1));...
b570: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
b580: 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
b590: 28 6f 62 6a 63 29 20 7b 0a 09 09 63 61 73 65 20  (objc) {...case 
b5a0: 30 3a 0a 09 09 63 61 73 65 20 31 3a 20 2f 2a 20  0:...case 1: /* 
b5b0: 4e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 6c 69  No arguments, li
b5c0: 73 74 20 61 6c 6c 20 69 6e 74 65 72 66 61 63 65  st all interface
b5d0: 73 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d  s */....retval =
b5e0: 20 74 75 61 70 69 5f 72 6f 75 74 65 5f 6c 69 73   tuapi_route_lis
b5f0: 74 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 6f 62  t(cd, interp, ob
b600: 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63 6b 5f 76  jc, objv, sock_v
b610: 34 2c 20 73 6f 63 6b 5f 76 36 29 3b 0a 0a 09 09  4, sock_v6);....
b620: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
b630: 74 3a 0a 09 09 09 2f 2a 20 4f 74 68 65 72 77 69  t:..../* Otherwi
b640: 73 65 2c 20 6d 6f 64 69 66 79 20 72 6f 75 74 65  se, modify route
b650: 73 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d  s */....retval =
b660: 20 74 75 61 70 69 5f 72 6f 75 74 65 5f 63 6f 6e   tuapi_route_con
b670: 66 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 6f 62  f(cd, interp, ob
b680: 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63 6b 5f 76  jc, objv, sock_v
b690: 34 2c 20 73 6f 63 6b 5f 76 36 29 3b 0a 0a 09 09  4, sock_v6);....
b6a0: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20  .break;..}.../* 
b6b0: 43 6c 65 61 6e 75 70 20 2a 2f 0a 09 69 66 20 28  Cleanup */..if (
b6c0: 73 6f 63 6b 5f 76 34 20 21 3d 20 2d 31 29 20 7b  sock_v4 != -1) {
b6d0: 0a 09 09 63 6c 6f 73 65 28 73 6f 63 6b 5f 76 34  ...close(sock_v4
b6e0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b  );..}...if (sock
b6f0: 5f 76 36 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63  _v6 != -1) {...c
b700: 6c 6f 73 65 28 73 6f 63 6b 5f 76 36 29 3b 0a 09  lose(sock_v6);..
b710: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
b720: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  l);.}..static in
b730: 74 20 74 75 61 70 69 5f 62 72 63 74 6c 5f 6c 69  t tuapi_brctl_li
b740: 73 74 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64  st(ClientData cd
b750: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
b760: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
b770: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
b780: 62 6a 76 5b 5d 2c 20 69 6e 74 20 73 6f 63 6b 29  bjv[], int sock)
b790: 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65   {..Tcl_SetObjRe
b7a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
b7b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
b7c0: 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 2c  ot implemented",
b7d0: 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28   -1));...return(
b7e0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73  TCL_ERROR);.}..s
b7f0: 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
b800: 62 72 63 74 6c 5f 63 6f 6e 66 28 43 6c 69 65 6e  brctl_conf(Clien
b810: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
b820: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
b830: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
b840: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c 20 69  *CONST objv[], i
b850: 6e 74 20 73 6f 63 6b 29 20 7b 0a 09 54 63 6c 5f  nt sock) {..Tcl_
b860: 4f 62 6a 20 2a 6f 70 65 72 61 74 69 6f 6e 5f 6f  Obj *operation_o
b870: 62 6a 2c 20 2a 62 72 69 64 67 65 5f 6e 61 6d 65  bj, *bridge_name
b880: 5f 6f 62 6a 2c 20 2a 69 6e 74 65 72 66 61 63 65  _obj, *interface
b890: 5f 6e 61 6d 65 5f 6f 62 6a 3b 0a 09 75 6e 73 69  _name_obj;..unsi
b8a0: 67 6e 65 64 20 6c 6f 6e 67 20 61 72 67 5b 34 5d  gned long arg[4]
b8b0: 3b 0a 09 73 74 72 75 63 74 20 69 66 72 65 71 20  ;..struct ifreq 
b8c0: 69 66 72 3b 0a 09 69 6e 74 20 69 6f 63 74 6c 5f  ifr;..int ioctl_
b8d0: 72 65 74 2c 20 69 6f 63 74 6c 5f 69 64 3b 0a 09  ret, ioctl_id;..
b8e0: 69 6e 74 20 61 64 64 20 3d 20 30 3b 0a 0a 09 2f  int add = 0;.../
b8f0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 6f 70 65 72  * Determine oper
b900: 61 74 69 6f 6e 20 2a 2f 0a 09 6f 70 65 72 61 74  ation */..operat
b910: 69 6f 6e 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31  ion_obj = objv[1
b920: 5d 3b 0a 09 73 77 69 74 63 68 20 28 74 75 61 70  ];..switch (tuap
b930: 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c  i_internal_simpl
b940: 65 68 61 73 68 5f 6f 62 6a 28 6f 70 65 72 61 74  ehash_obj(operat
b950: 69 6f 6e 5f 6f 62 6a 29 29 20 7b 0a 09 09 63 61  ion_obj)) {...ca
b960: 73 65 20 30 78 31 63 39 39 33 32 37 32 3a 20 2f  se 0x1c993272: /
b970: 2a 20 61 64 64 62 72 20 2a 2f 0a 09 09 09 61 64  * addbr */....ad
b980: 64 20 3d 20 31 3b 0a 09 09 63 61 73 65 20 30 78  d = 1;...case 0x
b990: 34 63 62 62 33 32 37 32 3a 20 2f 2a 20 64 65 6c  4cbb3272: /* del
b9a0: 62 72 20 2a 2f 0a 09 09 09 69 66 20 28 6f 62 6a  br */....if (obj
b9b0: 63 20 21 3d 20 33 29 20 7b 0a 09 09 09 09 69 66  c != 3) {.....if
b9c0: 20 28 61 64 64 29 20 7b 0a 09 09 09 09 09 54 63   (add) {......Tc
b9d0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
b9e0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
b9f0: 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23  ringObj("wrong #
ba00: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
ba10: 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63   \"::tuapi::sysc
ba20: 61 6c 6c 3a 3a 62 72 63 74 6c 20 61 64 64 62 72  all::brctl addbr
ba30: 20 62 72 69 64 67 65 5c 22 22 2c 20 2d 31 29 29   bridge\"", -1))
ba40: 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
ba50: 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ....Tcl_SetObjRe
ba60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
ba70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77  _NewStringObj("w
ba80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
ba90: 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70 69  uld be \"::tuapi
baa0: 3a 3a 73 79 73 63 61 6c 6c 3a 3a 62 72 63 74 6c  ::syscall::brctl
bab0: 20 64 65 6c 62 72 20 62 72 69 64 67 65 5c 22 22   delbr bridge\""
bac0: 2c 20 2d 31 29 29 3b 0a 09 09 09 09 7d 0a 0a 09  , -1));.....}...
bad0: 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
bae0: 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  ROR);....}.....b
baf0: 72 69 64 67 65 5f 6e 61 6d 65 5f 6f 62 6a 20 3d  ridge_name_obj =
bb00: 20 6f 62 6a 76 5b 32 5d 3b 0a 0a 09 09 09 69 66   objv[2];.....if
bb10: 20 28 61 64 64 29 20 7b 0a 09 09 09 09 61 72 67   (add) {.....arg
bb20: 5b 30 5d 20 3d 20 42 52 43 54 4c 5f 41 44 44 5f  [0] = BRCTL_ADD_
bb30: 42 52 49 44 47 45 3b 0a 09 09 09 7d 20 65 6c 73  BRIDGE;....} els
bb40: 65 20 7b 0a 09 09 09 09 61 72 67 5b 30 5d 20 3d  e {.....arg[0] =
bb50: 20 42 52 43 54 4c 5f 44 45 4c 5f 42 52 49 44 47   BRCTL_DEL_BRIDG
bb60: 45 3b 0a 09 09 09 7d 0a 0a 09 09 09 61 72 67 5b  E;....}.....arg[
bb70: 31 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  1] = (unsigned l
bb80: 6f 6e 67 29 20 54 63 6c 5f 47 65 74 53 74 72 69  ong) Tcl_GetStri
bb90: 6e 67 28 62 72 69 64 67 65 5f 6e 61 6d 65 5f 6f  ng(bridge_name_o
bba0: 62 6a 29 3b 0a 09 09 09 61 72 67 5b 32 5d 20 3d  bj);....arg[2] =
bbb0: 20 30 3b 0a 0a 09 09 09 69 6f 63 74 6c 5f 72 65   0;.....ioctl_re
bbc0: 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20  t = ioctl(sock, 
bbd0: 53 49 4f 43 47 49 46 42 52 2c 20 26 61 72 67 29  SIOCGIFBR, &arg)
bbe0: 3b 20 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ; .....break;...
bbf0: 63 61 73 65 20 30 78 31 43 39 39 33 37 45 36 3a  case 0x1C9937E6:
bc00: 20 2f 2a 20 61 64 64 69 66 20 2a 2f 0a 09 09 09   /* addif */....
bc10: 61 64 64 20 3d 20 31 3b 0a 09 09 63 61 73 65 20  add = 1;...case 
bc20: 30 78 34 63 62 62 33 37 65 36 3a 20 2f 2a 20 64  0x4cbb37e6: /* d
bc30: 65 6c 69 66 20 2a 2f 0a 09 09 09 69 66 20 28 6f  elif */....if (o
bc40: 62 6a 63 20 21 3d 20 34 29 20 7b 0a 09 09 09 09  bjc != 4) {.....
bc50: 69 66 20 28 61 64 64 29 20 7b 0a 09 09 09 09 09  if (add) {......
bc60: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
bc70: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
bc80: 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67  StringObj("wrong
bc90: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
bca0: 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79  be \"::tuapi::sy
bcb0: 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 20 61 64 64  scall::brctl add
bcc0: 69 66 20 62 72 69 64 67 65 20 69 6e 74 65 72 66  if bridge interf
bcd0: 61 63 65 5c 22 22 2c 20 2d 31 29 29 3b 0a 09 09  ace\"", -1));...
bce0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
bcf0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
bd00: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
bd10: 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67  StringObj("wrong
bd20: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
bd30: 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79  be \"::tuapi::sy
bd40: 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 20 64 65 6c  scall::brctl del
bd50: 69 66 20 62 72 69 64 67 65 20 69 6e 74 65 72 66  if bridge interf
bd60: 61 63 65 5c 22 22 2c 20 2d 31 29 29 3b 0a 09 09  ace\"", -1));...
bd70: 09 09 7d 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ..}......return(
bd80: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  TCL_ERROR);....}
bd90: 0a 0a 09 09 09 69 66 20 28 61 64 64 29 20 7b 0a  .....if (add) {.
bda0: 09 09 09 09 69 6f 63 74 6c 5f 69 64 20 3d 20 53  ....ioctl_id = S
bdb0: 49 4f 43 42 52 41 44 44 49 46 3b 0a 09 09 09 7d  IOCBRADDIF;....}
bdc0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 6f 63 74   else {.....ioct
bdd0: 6c 5f 69 64 20 3d 20 53 49 4f 43 42 52 44 45 4c  l_id = SIOCBRDEL
bde0: 49 46 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 69  IF;....}.....bri
bdf0: 64 67 65 5f 6e 61 6d 65 5f 6f 62 6a 20 3d 20 6f  dge_name_obj = o
be00: 62 6a 76 5b 32 5d 3b 0a 09 09 09 69 6e 74 65 72  bjv[2];....inter
be10: 66 61 63 65 5f 6e 61 6d 65 5f 6f 62 6a 20 3d 20  face_name_obj = 
be20: 6f 62 6a 76 5b 33 5d 3b 0a 0a 09 09 09 6d 65 6d  objv[3];.....mem
be30: 73 65 74 28 26 69 66 72 2c 20 30 2c 20 73 69 7a  set(&ifr, 0, siz
be40: 65 6f 66 28 69 66 72 29 29 3b 0a 09 09 09 73 6e  eof(ifr));....sn
be50: 70 72 69 6e 74 66 28 69 66 72 2e 69 66 72 5f 6e  printf(ifr.ifr_n
be60: 61 6d 65 2c 20 49 46 4e 41 4d 53 49 5a 2c 20 22  ame, IFNAMSIZ, "
be70: 25 73 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  %s", Tcl_GetStri
be80: 6e 67 28 69 6e 74 65 72 66 61 63 65 5f 6e 61 6d  ng(interface_nam
be90: 65 5f 6f 62 6a 29 29 3b 0a 0a 09 09 09 69 6f 63  e_obj));.....ioc
bea0: 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73  tl_ret = ioctl(s
beb0: 6f 63 6b 2c 20 53 49 4f 43 47 49 46 49 4e 44 45  ock, SIOCGIFINDE
bec0: 58 2c 20 28 76 6f 69 64 20 2a 29 20 26 69 66 72  X, (void *) &ifr
bed0: 29 3b 0a 09 09 09 69 66 20 28 69 6f 63 74 6c 5f  );....if (ioctl_
bee0: 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  ret == 0) {.....
bef0: 73 6e 70 72 69 6e 74 66 28 69 66 72 2e 69 66 72  snprintf(ifr.ifr
bf00: 5f 6e 61 6d 65 2c 20 49 46 4e 41 4d 53 49 5a 2c  _name, IFNAMSIZ,
bf10: 20 22 25 73 22 2c 20 54 63 6c 5f 47 65 74 53 74   "%s", Tcl_GetSt
bf20: 72 69 6e 67 28 62 72 69 64 67 65 5f 6e 61 6d 65  ring(bridge_name
bf30: 5f 6f 62 6a 29 29 3b 0a 09 09 09 09 69 6f 63 74  _obj));.....ioct
bf40: 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f  l_ret = ioctl(so
bf50: 63 6b 2c 20 69 6f 63 74 6c 5f 69 64 2c 20 28 76  ck, ioctl_id, (v
bf60: 6f 69 64 20 2a 29 20 26 69 66 72 29 3b 0a 09 09  oid *) &ifr);...
bf70: 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
bf80: 0a 0a 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74  ...if (ioctl_ret
bf90: 20 3c 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65   < 0) {...Tcl_Se
bfa0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
bfb0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
bfc0: 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72  Obj(strerror(err
bfd0: 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  no), -1));....re
bfe0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
bff0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  ..}...return(TCL
c000: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
c010: 69 6e 74 20 74 75 61 70 69 5f 62 72 63 74 6c 28  int tuapi_brctl(
c020: 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54  ClientData cd, T
c030: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c040: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
c050: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
c060: 5b 5d 29 20 7b 0a 09 69 6e 74 20 73 6f 63 6b 5f  []) {..int sock_
c070: 76 34 2c 20 73 6f 63 6b 5f 76 36 2c 20 73 6f 63  v4, sock_v6, soc
c080: 6b 3b 0a 09 69 6e 74 20 72 65 74 76 61 6c 20 3d  k;..int retval =
c090: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 09 73 6f   TCL_ERROR;...so
c0a0: 63 6b 20 3d 20 74 75 61 70 69 5f 69 6e 74 65 72  ck = tuapi_inter
c0b0: 6e 61 6c 5f 67 65 74 73 6f 63 6b 28 26 73 6f 63  nal_getsock(&soc
c0c0: 6b 5f 76 34 2c 20 26 73 6f 63 6b 5f 76 36 29 3b  k_v4, &sock_v6);
c0d0: 0a 09 69 66 20 28 73 6f 63 6b 20 3d 3d 20 2d 31  ..if (sock == -1
c0e0: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ) {...Tcl_SetObj
c0f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
c100: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
c110: 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74  "unable to creat
c120: 65 20 73 6f 63 6b 65 74 22 2c 20 2d 31 29 29 3b  e socket", -1));
c130: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
c140: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
c150: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 09 63 61  ch (objc) {...ca
c160: 73 65 20 30 3a 0a 09 09 63 61 73 65 20 31 3a 20  se 0:...case 1: 
c170: 2f 2a 20 4e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  /* No arguments,
c180: 20 6c 69 73 74 20 61 6c 6c 20 62 72 69 64 67 65   list all bridge
c190: 73 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20 3d  s */....retval =
c1a0: 20 74 75 61 70 69 5f 62 72 63 74 6c 5f 6c 69 73   tuapi_brctl_lis
c1b0: 74 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 6f 62  t(cd, interp, ob
c1c0: 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63 6b 29 3b  jc, objv, sock);
c1d0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  .....break;...de
c1e0: 66 61 75 6c 74 3a 0a 09 09 09 2f 2a 20 4f 74 68  fault:..../* Oth
c1f0: 65 72 77 69 73 65 2c 20 6d 6f 64 69 66 79 20 72  erwise, modify r
c200: 6f 75 74 65 73 20 2a 2f 0a 09 09 09 72 65 74 76  outes */....retv
c210: 61 6c 20 3d 20 74 75 61 70 69 5f 62 72 63 74 6c  al = tuapi_brctl
c220: 5f 63 6f 6e 66 28 63 64 2c 20 69 6e 74 65 72 70  _conf(cd, interp
c230: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f  , objc, objv, so
c240: 63 6b 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ck);.....break;.
c250: 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 6e 75 70 20  .}.../* Cleanup 
c260: 2a 2f 0a 09 69 66 20 28 73 6f 63 6b 5f 76 34 20  */..if (sock_v4 
c270: 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 73 65  != -1) {...close
c280: 28 73 6f 63 6b 5f 76 34 29 3b 0a 09 7d 0a 0a 09  (sock_v4);..}...
c290: 69 66 20 28 73 6f 63 6b 5f 76 36 20 21 3d 20 2d  if (sock_v6 != -
c2a0: 31 29 20 7b 0a 09 09 63 6c 6f 73 65 28 73 6f 63  1) {...close(soc
c2b0: 6b 5f 76 36 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  k_v6);..}...retu
c2c0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
c2d0: 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
c2e0: 76 63 6f 6e 66 69 67 28 43 6c 69 65 6e 74 44 61  vconfig(ClientDa
c2f0: 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  ta cd, Tcl_Inter
c300: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
c310: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
c320: 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 69  NST objv[]) {..i
c330: 6e 74 20 73 6f 63 6b 5f 76 34 2c 20 73 6f 63 6b  nt sock_v4, sock
c340: 5f 76 36 2c 20 73 6f 63 6b 3b 0a 09 69 6e 74 20  _v6, sock;..int 
c350: 72 65 74 76 61 6c 20 3d 20 54 43 4c 5f 45 52 52  retval = TCL_ERR
c360: 4f 52 3b 0a 0a 09 73 6f 63 6b 20 3d 20 74 75 61  OR;...sock = tua
c370: 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 67 65 74 73  pi_internal_gets
c380: 6f 63 6b 28 26 73 6f 63 6b 5f 76 34 2c 20 26 73  ock(&sock_v4, &s
c390: 6f 63 6b 5f 76 36 29 3b 0a 09 69 66 20 28 73 6f  ock_v6);..if (so
c3a0: 63 6b 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 54 63  ck == -1) {...Tc
c3b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c3c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
c3d0: 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65 20  ringObj("unable 
c3e0: 74 6f 20 63 72 65 61 74 65 20 73 6f 63 6b 65 74  to create socket
c3f0: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75  ", -1));....retu
c400: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
c410: 7d 0a 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }...Tcl_SetObjRe
c420: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
c430: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
c440: 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 2c  ot implemented",
c450: 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 43 6c 65 61   -1));.../* Clea
c460: 6e 75 70 20 2a 2f 0a 09 69 66 20 28 73 6f 63 6b  nup */..if (sock
c470: 5f 76 34 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63  _v4 != -1) {...c
c480: 6c 6f 73 65 28 73 6f 63 6b 5f 76 34 29 3b 0a 09  lose(sock_v4);..
c490: 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 36 20  }...if (sock_v6 
c4a0: 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 73 65  != -1) {...close
c4b0: 28 73 6f 63 6b 5f 76 36 29 3b 0a 09 7d 0a 0a 09  (sock_v6);..}...
c4c0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
c4d0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
c4e0: 61 70 69 5f 73 74 74 79 28 43 6c 69 65 6e 74 44  api_stty(ClientD
c4f0: 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65  ata cd, Tcl_Inte
c500: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
c510: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43  objc, Tcl_Obj *C
c520: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09  ONST objv[]) {..
c530: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 2c 20 2a 72  Tcl_Obj *obj, *r
c540: 65 74 6f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 09 73  etobj = NULL;..s
c550: 74 72 75 63 74 20 74 65 72 6d 69 6f 73 20 74 65  truct termios te
c560: 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69  rminal_informati
c570: 6f 6e 3b 0a 09 73 74 72 75 63 74 20 77 69 6e 73  on;..struct wins
c580: 69 7a 65 20 74 65 72 6d 69 6e 61 6c 5f 73 69 7a  ize terminal_siz
c590: 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
c5a0: 67 20 6f 62 6a 5f 68 61 73 68 3b 0a 09 69 6e 74  g obj_hash;..int
c5b0: 20 66 64 2c 20 69 64 78 3b 0a 09 69 6e 74 20 69   fd, idx;..int i
c5c0: 6f 63 74 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 72  octl_ret;..int r
c5d0: 65 74 76 61 6c 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  etval = TCL_OK;.
c5e0: 0a 09 66 64 20 3d 20 53 54 44 49 4e 5f 46 49 4c  ..fd = STDIN_FIL
c5f0: 45 4e 4f 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20  ENO;...for (idx 
c600: 3d 20 31 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 1; idx < objc;
c610: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6f 62 6a 20   idx++) {...obj 
c620: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 09 6f  = objv[idx];...o
c630: 62 6a 5f 68 61 73 68 20 3d 20 74 75 61 70 69 5f  bj_hash = tuapi_
c640: 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68  internal_simpleh
c650: 61 73 68 5f 6f 62 6a 28 6f 62 6a 29 3b 0a 0a 09  ash_obj(obj);...
c660: 09 73 77 69 74 63 68 20 28 6f 62 6a 5f 68 61 73  .switch (obj_has
c670: 68 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 65  h) {....case 0xe
c680: 37 61 37 64 36 35 3a 20 2f 2a 20 73 69 7a 65 20  7a7d65: /* size 
c690: 2a 2f 0a 09 09 09 09 69 6f 63 74 6c 5f 72 65 74  */.....ioctl_ret
c6a0: 20 3d 20 69 6f 63 74 6c 28 66 64 2c 20 54 49 4f   = ioctl(fd, TIO
c6b0: 43 47 57 49 4e 53 5a 2c 20 26 74 65 72 6d 69 6e  CGWINSZ, &termin
c6c0: 61 6c 5f 73 69 7a 65 29 3b 0a 09 09 09 09 69 66  al_size);.....if
c6d0: 20 28 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30   (ioctl_ret != 0
c6e0: 29 20 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74  ) {......Tcl_Set
c6f0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
c700: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
c710: 62 6a 28 22 69 6f 63 74 6c 20 66 61 69 6c 65 64  bj("ioctl failed
c720: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 09 72  ", -1));.......r
c730: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
c740: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
c750: 28 72 65 74 6f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  (retobj == NULL)
c760: 20 7b 0a 09 09 09 09 09 72 65 74 6f 62 6a 20 3d   {......retobj =
c770: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09   Tcl_NewObj();..
c780: 09 09 09 7d 0a 0a 09 09 09 09 54 63 6c 5f 4c 69  ...}......Tcl_Li
c790: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
c7a0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 74 6f 62  nt(interp, retob
c7b0: 6a 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  j, Tcl_NewLongOb
c7c0: 6a 28 74 65 72 6d 69 6e 61 6c 5f 73 69 7a 65 2e  j(terminal_size.
c7d0: 77 73 5f 72 6f 77 29 29 3b 0a 09 09 09 09 54 63  ws_row));.....Tc
c7e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
c7f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
c800: 65 74 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 4c 6f  etobj, Tcl_NewLo
c810: 6e 67 4f 62 6a 28 74 65 72 6d 69 6e 61 6c 5f 73  ngObj(terminal_s
c820: 69 7a 65 2e 77 73 5f 63 6f 6c 29 29 3b 0a 0a 09  ize.ws_col));...
c830: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
c840: 65 20 30 78 35 62 63 62 30 66 37 3a 20 2f 2a 20  e 0x5bcb0f7: /* 
c850: 2d 72 61 77 20 2a 2f 0a 09 09 09 63 61 73 65 20  -raw */....case 
c860: 30 78 31 63 62 30 66 37 3a 20 2f 2a 20 72 61 77  0x1cb0f7: /* raw
c870: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 64 63   */....case 0xdc
c880: 62 38 66 35 36 66 3a 20 2f 2a 20 2d 65 63 68 6f  b8f56f: /* -echo
c890: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 63 62   */....case 0xcb
c8a0: 38 66 34 36 66 3a 20 2f 2a 20 65 63 68 6f 20 2a  8f46f: /* echo *
c8b0: 2f 0a 09 09 09 09 69 6f 63 74 6c 5f 72 65 74 20  /.....ioctl_ret 
c8c0: 3d 20 69 6f 63 74 6c 28 66 64 2c 20 54 43 47 45  = ioctl(fd, TCGE
c8d0: 54 53 2c 20 26 74 65 72 6d 69 6e 61 6c 5f 69 6e  TS, &terminal_in
c8e0: 66 6f 72 6d 61 74 69 6f 6e 29 3b 0a 09 09 09 09  formation);.....
c8f0: 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 21 3d  if (ioctl_ret !=
c900: 20 30 29 20 7b 0a 09 09 09 09 09 54 63 6c 5f 53   0) {......Tcl_S
c910: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
c920: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
c930: 67 4f 62 6a 28 22 69 6f 63 74 6c 20 66 61 69 6c  gObj("ioctl fail
c940: 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09  ed", -1));......
c950: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
c960: 52 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73  R);.....}......s
c970: 77 69 74 63 68 20 28 6f 62 6a 5f 68 61 73 68 29  witch (obj_hash)
c980: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 30 78 35   {......case 0x5
c990: 62 63 62 30 66 37 3a 20 2f 2a 20 2d 72 61 77 20  bcb0f7: /* -raw 
c9a0: 2a 2f 0a 09 09 09 09 09 09 74 65 72 6d 69 6e 61  */.......termina
c9b0: 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f  l_information.c_
c9c0: 69 66 6c 61 67 20 7c 3d 20 42 52 4b 49 4e 54 20  iflag |= BRKINT 
c9d0: 7c 20 49 47 4e 50 41 52 20 7c 20 49 53 54 52 49  | IGNPAR | ISTRI
c9e0: 50 20 7c 20 49 43 52 4e 4c 20 7c 20 49 58 4f 4e  P | ICRNL | IXON
c9f0: 3b 0a 09 09 09 09 09 09 74 65 72 6d 69 6e 61 6c  ;.......terminal
ca00: 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f 6f  _information.c_o
ca10: 66 6c 61 67 20 7c 3d 20 4f 50 4f 53 54 3b 0a 09  flag |= OPOST;..
ca20: 09 09 09 09 09 74 65 72 6d 69 6e 61 6c 5f 69 6e  .....terminal_in
ca30: 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f 6c 66 6c 61  formation.c_lfla
ca40: 67 20 7c 3d 20 49 53 49 47 20 7c 20 49 43 41 4e  g |= ISIG | ICAN
ca50: 4f 4e 3b 0a 23 69 66 20 56 4d 49 4e 20 3d 3d 20  ON;.#if VMIN == 
ca60: 56 45 4f 46 0a 09 09 09 09 09 09 74 65 72 6d 69  VEOF.......termi
ca70: 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal_information.
ca80: 63 5f 63 63 5b 56 45 4f 46 5d 20 3d 20 43 45 4f  c_cc[VEOF] = CEO
ca90: 46 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 56 54  F;.#endif.#if VT
caa0: 49 4d 45 20 3d 3d 20 56 45 4f 4c 0a 09 09 09 09  IME == VEOL.....
cab0: 09 09 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72  ..terminal_infor
cac0: 6d 61 74 69 6f 6e 2e 63 5f 63 63 5b 56 45 4f 4c  mation.c_cc[VEOL
cad0: 5d 20 3d 20 43 45 4f 4c 3b 0a 23 65 6e 64 69 66  ] = CEOL;.#endif
cae0: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
caf0: 09 09 09 63 61 73 65 20 30 78 31 63 62 30 66 37  ...case 0x1cb0f7
cb00: 3a 20 2f 2a 20 72 61 77 20 2a 2f 0a 09 09 09 09  : /* raw */.....
cb10: 09 09 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72  ..terminal_infor
cb20: 6d 61 74 69 6f 6e 2e 63 5f 69 66 6c 61 67 20 26  mation.c_iflag &
cb30: 3d 20 7e 28 49 47 4e 42 52 4b 20 7c 20 42 52 4b  = ~(IGNBRK | BRK
cb40: 49 4e 54 20 7c 20 50 41 52 4d 52 4b 20 7c 20 49  INT | PARMRK | I
cb50: 53 54 52 49 50 20 7c 20 49 4e 4c 43 52 20 7c 20  STRIP | INLCR | 
cb60: 49 47 4e 43 52 20 7c 20 49 43 52 4e 4c 20 7c 20  IGNCR | ICRNL | 
cb70: 49 58 4f 4e 29 3b 0a 09 09 09 09 09 09 74 65 72  IXON);.......ter
cb80: 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f  minal_informatio
cb90: 6e 2e 63 5f 6f 66 6c 61 67 20 26 3d 20 7e 4f 50  n.c_oflag &= ~OP
cba0: 4f 53 54 3b 0a 09 09 09 09 09 09 74 65 72 6d 69  OST;.......termi
cbb0: 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal_information.
cbc0: 63 5f 6c 66 6c 61 67 20 26 3d 20 7e 28 49 53 49  c_lflag &= ~(ISI
cbd0: 47 20 7c 20 49 43 41 4e 4f 4e 29 3b 0a 09 09 09  G | ICANON);....
cbe0: 09 09 09 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f  ...terminal_info
cbf0: 72 6d 61 74 69 6f 6e 2e 63 5f 63 63 5b 56 4d 49  rmation.c_cc[VMI
cc00: 4e 5d 20 3d 20 31 3b 0a 09 09 09 09 09 09 74 65  N] = 1;.......te
cc10: 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69  rminal_informati
cc20: 6f 6e 2e 63 5f 63 63 5b 56 54 49 4d 45 5d 20 3d  on.c_cc[VTIME] =
cc30: 20 30 3b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b   0;.......break;
cc40: 0a 09 09 09 09 09 63 61 73 65 20 30 78 64 63 62  ......case 0xdcb
cc50: 38 66 35 36 66 3a 20 2f 2a 20 2d 65 63 68 6f 20  8f56f: /* -echo 
cc60: 2a 2f 0a 09 09 09 09 09 09 74 65 72 6d 69 6e 61  */.......termina
cc70: 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f  l_information.c_
cc80: 6c 66 6c 61 67 20 26 3d 20 7e 45 43 48 4f 3b 0a  lflag &= ~ECHO;.
cc90: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
cca0: 09 09 63 61 73 65 20 30 78 63 62 38 66 34 36 66  ..case 0xcb8f46f
ccb0: 3a 20 2f 2a 20 65 63 68 6f 20 2a 2f 0a 09 09 09  : /* echo */....
ccc0: 09 09 09 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f  ...terminal_info
ccd0: 72 6d 61 74 69 6f 6e 2e 63 5f 6c 66 6c 61 67 20  rmation.c_lflag 
cce0: 7c 3d 20 45 43 48 4f 3b 0a 09 09 09 09 09 09 62  |= ECHO;.......b
ccf0: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
cd00: 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63  .ioctl_ret = ioc
cd10: 74 6c 28 66 64 2c 20 54 43 53 45 54 53 2c 20 26  tl(fd, TCSETS, &
cd20: 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61  terminal_informa
cd30: 74 69 6f 6e 29 3b 0a 09 09 09 09 69 66 20 28 69  tion);.....if (i
cd40: 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30 29 20 7b  octl_ret != 0) {
cd50: 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ......Tcl_SetObj
cd60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
cd70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
cd80: 22 69 6f 63 74 6c 20 66 61 69 6c 65 64 22 2c 20  "ioctl failed", 
cd90: 2d 31 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  -1));.......retu
cda0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
cdb0: 09 09 09 7d 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ...}......break;
cdc0: 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
cdd0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
cde0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
cdf0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 75 62 63  wStringObj("subc
ce00: 6f 6d 6d 61 6e 64 20 6e 6f 74 20 69 6d 70 6c 65  ommand not imple
ce10: 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29 3b 0a 09  mented", -1));..
ce20: 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
ce30: 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ROR);...}..}...i
ce40: 66 20 28 72 65 74 6f 62 6a 20 21 3d 20 4e 55 4c  f (retobj != NUL
ce50: 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  L) {...Tcl_SetOb
ce60: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
ce70: 72 65 74 6f 62 6a 29 3b 0a 09 7d 0a 0a 09 72 65  retobj);..}...re
ce80: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
ce90: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70  .static int tuap
cea0: 69 5f 72 6c 69 6d 69 74 28 43 6c 69 65 6e 74 44  i_rlimit(ClientD
ceb0: 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65  ata cd, Tcl_Inte
cec0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
ced0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43  objc, Tcl_Obj *C
cee0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09  ONST objv[]) {..
cef0: 54 63 6c 5f 4f 62 6a 20 2a 6f 70 65 72 61 74 69  Tcl_Obj *operati
cf00: 6f 6e 5f 6f 62 6a 2c 20 2a 72 65 73 6f 75 72 63  on_obj, *resourc
cf10: 65 5f 69 64 5f 6f 62 6a 2c 20 2a 72 65 73 6f 75  e_id_obj, *resou
cf20: 72 63 65 5f 76 61 6c 5f 69 74 65 6d 5f 6f 62 6a  rce_val_item_obj
cf30: 2c 20 2a 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f  , *resource_val_
cf40: 69 74 65 6d 76 61 6c 5f 6f 62 6a 2c 20 2a 72 65  itemval_obj, *re
cf50: 74 5f 6f 62 6a 3b 0a 09 73 74 72 75 63 74 20 72  t_obj;..struct r
cf60: 6c 69 6d 69 74 20 72 65 73 6f 75 72 63 65 5f 76  limit resource_v
cf70: 61 6c 3b 0a 09 54 63 6c 5f 57 69 64 65 49 6e 74  al;..Tcl_WideInt
cf80: 20 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74   resource_val_it
cf90: 65 6d 3b 0a 09 69 6e 74 20 72 65 73 6f 75 72 63  em;..int resourc
cfa0: 65 5f 69 64 3b 0a 09 69 6e 74 20 72 6c 69 6d 69  e_id;..int rlimi
cfb0: 74 5f 72 65 74 2c 20 74 63 6c 5f 72 65 74 3b 0a  t_ret, tcl_ret;.
cfc0: 0a 09 69 66 20 28 6f 62 6a 63 20 3c 20 33 29 20  ..if (objc < 3) 
cfd0: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
cfe0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
cff0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77  _NewStringObj("w
d000: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
d010: 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70 69  uld be \"::tuapi
d020: 3a 3a 73 79 73 63 61 6c 6c 3a 3a 72 6c 69 6d 69  ::syscall::rlimi
d030: 74 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 73 6f  t operation reso
d040: 75 72 63 65 20 3f 76 61 6c 75 65 3f 5c 22 22 2c  urce ?value?\"",
d050: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
d060: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
d070: 0a 09 6f 70 65 72 61 74 69 6f 6e 5f 6f 62 6a 20  ..operation_obj 
d080: 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 09 72 65 73 6f  = objv[1];..reso
d090: 75 72 63 65 5f 69 64 5f 6f 62 6a 20 3d 20 6f 62  urce_id_obj = ob
d0a0: 6a 76 5b 32 5d 3b 0a 0a 09 73 77 69 74 63 68 20  jv[2];...switch 
d0b0: 28 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f  (tuapi_internal_
d0c0: 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 72  simplehash_obj(r
d0d0: 65 73 6f 75 72 63 65 5f 69 64 5f 6f 62 6a 29 29  esource_id_obj))
d0e0: 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 64 33   {...case 0x20d3
d0f0: 4c 55 3a 20 2f 2a 20 41 53 20 2a 2f 0a 09 09 09  LU: /* AS */....
d100: 72 65 73 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c  resource_id = RL
d110: 49 4d 49 54 5f 41 53 3b 0a 09 09 09 62 72 65 61  IMIT_AS;....brea
d120: 6b 3b 0a 09 09 63 61 73 65 20 30 78 38 37 33 65  k;...case 0x873e
d130: 39 34 35 4c 55 3a 20 2f 2a 20 43 4f 52 45 20 2a  945LU: /* CORE *
d140: 2f 0a 09 09 09 72 65 73 6f 75 72 63 65 5f 69 64  /....resource_id
d150: 20 3d 20 52 4c 49 4d 49 54 5f 43 4f 52 45 3b 0a   = RLIMIT_CORE;.
d160: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
d170: 20 30 78 31 30 65 38 35 35 4c 55 3a 20 2f 2a 20   0x10e855LU: /* 
d180: 43 50 55 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72  CPU */....resour
d190: 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f 43  ce_id = RLIMIT_C
d1a0: 50 55 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  PU;....break;...
d1b0: 63 61 73 65 20 30 78 38 39 30 36 61 34 31 4c 55  case 0x8906a41LU
d1c0: 3a 20 2f 2a 20 44 41 54 41 20 2a 2f 0a 09 09 09  : /* DATA */....
d1d0: 72 65 73 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c  resource_id = RL
d1e0: 49 4d 49 54 5f 44 41 54 41 3b 0a 09 09 09 62 72  IMIT_DATA;....br
d1f0: 65 61 6b 3b 0a 09 09 63 61 73 65 20 30 78 36 61  eak;...case 0x6a
d200: 37 32 36 66 34 35 4c 55 3a 20 2f 2a 20 46 53 49  726f45LU: /* FSI
d210: 5a 45 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72 63  ZE */....resourc
d220: 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f 46 53  e_id = RLIMIT_FS
d230: 49 5a 45 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 23  IZE;....break;.#
d240: 69 66 64 65 66 20 52 4c 49 4d 49 54 5f 4c 4f 43  ifdef RLIMIT_LOC
d250: 4b 53 0a 09 09 63 61 73 65 20 30 78 63 39 66 30  KS...case 0xc9f0
d260: 65 37 64 33 4c 55 3a 20 2f 2a 20 4c 4f 43 4b 53  e7d3LU: /* LOCKS
d270: 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72 63 65 5f   */....resource_
d280: 69 64 20 3d 20 52 4c 49 4d 49 54 5f 4c 4f 43 4b  id = RLIMIT_LOCK
d290: 53 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e  S;....break;.#en
d2a0: 64 69 66 0a 09 09 63 61 73 65 20 30 78 64 39 30  dif...case 0xd90
d2b0: 38 66 37 63 62 4c 55 3a 20 2f 2a 20 4d 45 4d 4c  8f7cbLU: /* MEML
d2c0: 4f 43 4b 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72  OCK */....resour
d2d0: 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f 4d  ce_id = RLIMIT_M
d2e0: 45 4d 4c 4f 43 4b 3b 0a 09 09 09 62 72 65 61 6b  EMLOCK;....break
d2f0: 3b 0a 23 69 66 64 65 66 20 52 4c 49 4d 49 54 5f  ;.#ifdef RLIMIT_
d300: 4d 53 47 51 55 45 55 45 0a 09 09 63 61 73 65 20  MSGQUEUE...case 
d310: 30 78 35 37 31 36 37 34 34 35 4c 55 3a 20 2f 2a  0x57167445LU: /*
d320: 20 4d 53 47 51 55 45 55 45 20 2a 2f 0a 09 09 09   MSGQUEUE */....
d330: 72 65 73 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c  resource_id = RL
d340: 49 4d 49 54 5f 4d 53 47 51 55 45 55 45 3b 0a 09  IMIT_MSGQUEUE;..
d350: 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
d360: 09 09 63 61 73 65 20 30 78 39 64 32 36 31 63 35  ..case 0x9d261c5
d370: 4c 55 3a 20 2f 2a 20 4e 49 43 45 20 2a 2f 0a 09  LU: /* NICE */..
d380: 09 09 72 65 73 6f 75 72 63 65 5f 69 64 20 3d 20  ..resource_id = 
d390: 52 4c 49 4d 49 54 5f 4e 49 43 45 3b 0a 09 09 09  RLIMIT_NICE;....
d3a0: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 30 78  break;...case 0x
d3b0: 66 38 64 33 35 63 34 35 4c 55 3a 20 2f 2a 20 4e  f8d35c45LU: /* N
d3c0: 4f 46 49 4c 45 20 2a 2f 0a 09 09 63 61 73 65 20  OFILE */...case 
d3d0: 30 78 66 38 64 32 36 34 34 35 4c 55 3a 20 2f 2a  0xf8d26445LU: /*
d3e0: 20 4f 46 49 4c 45 20 2a 2f 0a 09 09 09 72 65 73   OFILE */....res
d3f0: 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49  ource_id = RLIMI
d400: 54 5f 4e 4f 46 49 4c 45 3b 0a 09 09 09 62 72 65  T_NOFILE;....bre
d410: 61 6b 3b 0a 09 09 63 61 73 65 20 30 78 65 61 31  ak;...case 0xea1
d420: 34 61 35 63 33 4c 55 3a 20 2f 2a 20 4e 50 52 4f  4a5c3LU: /* NPRO
d430: 43 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72 63 65  C */....resource
d440: 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f 4e 50 52  _id = RLIMIT_NPR
d450: 4f 43 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  OC;....break;...
d460: 63 61 73 65 20 30 78 31 34 61 39 64 33 4c 55 3a  case 0x14a9d3LU:
d470: 20 2f 2a 20 52 53 53 20 2a 2f 0a 09 09 09 72 65   /* RSS */....re
d480: 73 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d  source_id = RLIM
d490: 49 54 5f 52 53 53 3b 0a 09 09 09 62 72 65 61 6b  IT_RSS;....break
d4a0: 3b 0a 23 69 66 64 65 66 20 52 4c 49 4d 49 54 5f  ;.#ifdef RLIMIT_
d4b0: 52 54 50 52 49 4f 0a 09 09 63 61 73 65 20 30 78  RTPRIO...case 0x
d4c0: 34 61 31 35 65 65 34 66 4c 55 3a 20 2f 2a 20 52  4a15ee4fLU: /* R
d4d0: 54 50 52 49 4f 20 2a 2f 0a 09 09 09 72 65 73 6f  TPRIO */....reso
d4e0: 75 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54  urce_id = RLIMIT
d4f0: 5f 52 54 50 52 49 4f 3b 0a 09 09 09 62 72 65 61  _RTPRIO;....brea
d500: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  k;.#endif.#ifdef
d510: 20 52 4c 49 4d 49 54 5f 52 54 54 49 4d 45 0a 09   RLIMIT_RTTIME..
d520: 09 63 61 73 65 20 30 78 34 61 39 33 32 63 34 35  .case 0x4a932c45
d530: 4c 55 3a 20 2f 2a 20 52 54 54 49 4d 45 20 2a 2f  LU: /* RTTIME */
d540: 0a 09 09 09 72 65 73 6f 75 72 63 65 5f 69 64 20  ....resource_id 
d550: 3d 20 52 4c 49 4d 49 54 5f 52 54 54 49 4d 45 3b  = RLIMIT_RTTIME;
d560: 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  ....break;.#endi
d570: 66 0a 23 69 66 64 65 66 20 52 4c 49 4d 49 54 5f  f.#ifdef RLIMIT_
d580: 53 49 47 50 45 4e 44 49 4e 47 0a 09 09 63 61 73  SIGPENDING...cas
d590: 65 20 30 78 32 66 33 39 30 33 34 37 4c 55 3a 20  e 0x2f390347LU: 
d5a0: 2f 2a 20 53 49 47 50 45 4e 44 49 4e 47 20 2a 2f  /* SIGPENDING */
d5b0: 0a 09 09 09 72 65 73 6f 75 72 63 65 5f 69 64 20  ....resource_id 
d5c0: 3d 20 52 4c 49 4d 49 54 5f 53 49 47 50 45 4e 44  = RLIMIT_SIGPEND
d5d0: 49 4e 47 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 23  ING;....break;.#
d5e0: 65 6e 64 69 66 0a 09 09 63 61 73 65 20 30 78 33  endif...case 0x3
d5f0: 61 39 30 36 33 34 62 4c 55 3a 20 2f 2a 20 53 54  a90634bLU: /* ST
d600: 41 43 4b 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72  ACK */....resour
d610: 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f 53  ce_id = RLIMIT_S
d620: 54 41 43 4b 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  TACK;....break;.
d630: 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 54 63  ..default:....Tc
d640: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
d650: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
d660: 72 69 6e 67 4f 62 6a 28 22 69 6e 76 61 6c 69 64  ringObj("invalid
d670: 20 72 65 73 6f 75 72 63 65 22 2c 20 2d 31 29 29   resource", -1))
d680: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c  ;.....return(TCL
d690: 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
d6a0: 20 28 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74   (strcmp(Tcl_Get
d6b0: 53 74 72 69 6e 67 28 6f 70 65 72 61 74 69 6f 6e  String(operation
d6c0: 5f 6f 62 6a 29 2c 20 22 67 65 74 22 29 20 3d 3d  _obj), "get") ==
d6d0: 20 30 29 20 7b 0a 09 09 69 66 20 28 6f 62 6a 63   0) {...if (objc
d6e0: 20 21 3d 20 33 29 20 7b 0a 09 09 09 54 63 6c 5f   != 3) {....Tcl_
d6f0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
d700: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
d710: 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61  ngObj("wrong # a
d720: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
d730: 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  "::tuapi::syscal
d740: 6c 3a 3a 72 6c 69 6d 69 74 20 67 65 74 20 72 65  l::rlimit get re
d750: 73 6f 75 72 63 65 5c 22 22 2c 20 2d 31 29 29 3b  source\"", -1));
d760: 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  .....return(TCL_
d770: 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 72  ERROR);...}....r
d780: 6c 69 6d 69 74 5f 72 65 74 20 3d 20 67 65 74 72  limit_ret = getr
d790: 6c 69 6d 69 74 28 72 65 73 6f 75 72 63 65 5f 69  limit(resource_i
d7a0: 64 2c 20 26 72 65 73 6f 75 72 63 65 5f 76 61 6c  d, &resource_val
d7b0: 29 3b 0a 09 09 69 66 20 28 72 6c 69 6d 69 74 5f  );...if (rlimit_
d7c0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 54  ret != 0) {....T
d7d0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
d7e0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
d7f0: 74 72 69 6e 67 4f 62 6a 28 22 67 65 74 72 6c 69  tringObj("getrli
d800: 6d 69 74 28 29 20 66 61 69 6c 65 64 22 2c 20 2d  mit() failed", -
d810: 31 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  1));.....return(
d820: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a  TCL_ERROR);...}.
d830: 0a 09 09 72 65 74 5f 6f 62 6a 20 3d 20 54 63 6c  ...ret_obj = Tcl
d840: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 09 54 63 6c  _NewObj();...Tcl
d850: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
d860: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
d870: 74 5f 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  t_obj, Tcl_NewSt
d880: 72 69 6e 67 4f 62 6a 28 22 73 6f 66 74 22 2c 20  ringObj("soft", 
d890: 2d 31 29 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  -1));...Tcl_List
d8a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
d8b0: 28 69 6e 74 65 72 70 2c 20 72 65 74 5f 6f 62 6a  (interp, ret_obj
d8c0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
d8d0: 4f 62 6a 28 72 65 73 6f 75 72 63 65 5f 76 61 6c  Obj(resource_val
d8e0: 2e 72 6c 69 6d 5f 63 75 72 29 29 3b 0a 09 09 54  .rlim_cur));...T
d8f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
d900: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
d910: 72 65 74 5f 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77  ret_obj, Tcl_New
d920: 53 74 72 69 6e 67 4f 62 6a 28 22 68 61 72 64 22  StringObj("hard"
d930: 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c 5f 4c 69  , -1));...Tcl_Li
d940: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
d950: 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 74 5f 6f  nt(interp, ret_o
d960: 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  bj, Tcl_NewWideI
d970: 6e 74 4f 62 6a 28 72 65 73 6f 75 72 63 65 5f 76  ntObj(resource_v
d980: 61 6c 2e 72 6c 69 6d 5f 6d 61 78 29 29 3b 0a 0a  al.rlim_max));..
d990: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
d9a0: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 74 5f 6f  lt(interp, ret_o
d9b0: 62 6a 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54  bj);....return(T
d9c0: 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  CL_OK);..}...if 
d9d0: 28 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53  (strcmp(Tcl_GetS
d9e0: 74 72 69 6e 67 28 6f 70 65 72 61 74 69 6f 6e 5f  tring(operation_
d9f0: 6f 62 6a 29 2c 20 22 73 65 74 22 29 20 3d 3d 20  obj), "set") == 
da00: 30 29 20 7b 0a 09 09 69 66 20 28 6f 62 6a 63 20  0) {...if (objc 
da10: 21 3d 20 34 29 20 7b 0a 09 09 09 54 63 6c 5f 53  != 4) {....Tcl_S
da20: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
da30: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
da40: 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72  gObj("wrong # ar
da50: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
da60: 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c  ::tuapi::syscall
da70: 3a 3a 72 6c 69 6d 69 74 20 73 65 74 20 72 65 73  ::rlimit set res
da80: 6f 75 72 63 65 20 76 61 6c 75 65 5c 22 22 2c 20  ource value\"", 
da90: 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  -1));.....return
daa0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  (TCL_ERROR);...}
dab0: 0a 0a 09 09 72 65 73 6f 75 72 63 65 5f 76 61 6c  ....resource_val
dac0: 5f 69 74 65 6d 5f 6f 62 6a 20 3d 20 6f 62 6a 76  _item_obj = objv
dad0: 5b 33 5d 3b 0a 0a 09 09 2f 2a 20 44 65 74 65 72  [3];..../* Deter
dae0: 6d 69 6e 65 20 69 66 20 77 65 20 77 65 72 65 20  mine if we were 
daf0: 61 73 6b 65 64 20 74 6f 20 73 65 74 20 74 6f 20  asked to set to 
db00: 61 20 73 69 6d 70 6c 65 20 76 61 6c 75 65 2c 20  a simple value, 
db10: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 73 65  in which case se
db20: 74 20 62 6f 74 68 20 68 61 72 64 20 61 6e 64 20  t both hard and 
db30: 73 6f 66 74 20 6c 69 6d 69 74 73 20 2a 2f 0a 09  soft limits */..
db40: 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 47  .tcl_ret = Tcl_G
db50: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
db60: 28 4e 55 4c 4c 2c 20 72 65 73 6f 75 72 63 65 5f  (NULL, resource_
db70: 76 61 6c 5f 69 74 65 6d 5f 6f 62 6a 2c 20 26 72  val_item_obj, &r
db80: 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d  esource_val_item
db90: 29 3b 0a 09 09 69 66 20 28 74 63 6c 5f 72 65 74  );...if (tcl_ret
dba0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   == TCL_OK) {...
dbb0: 09 72 65 73 6f 75 72 63 65 5f 76 61 6c 2e 72 6c  .resource_val.rl
dbc0: 69 6d 5f 63 75 72 20 3d 20 72 65 73 6f 75 72 63  im_cur = resourc
dbd0: 65 5f 76 61 6c 5f 69 74 65 6d 3b 0a 09 09 09 72  e_val_item;....r
dbe0: 65 73 6f 75 72 63 65 5f 76 61 6c 2e 72 6c 69 6d  esource_val.rlim
dbf0: 5f 6d 61 78 20 3d 20 72 65 73 6f 75 72 63 65 5f  _max = resource_
dc00: 76 61 6c 5f 69 74 65 6d 3b 0a 09 09 7d 20 65 6c  val_item;...} el
dc10: 73 65 20 7b 0a 09 09 09 74 63 6c 5f 72 65 74 20  se {....tcl_ret 
dc20: 3d 20 54 63 6c 5f 44 69 63 74 4f 62 6a 47 65 74  = Tcl_DictObjGet
dc30: 28 4e 55 4c 4c 2c 20 72 65 73 6f 75 72 63 65 5f  (NULL, resource_
dc40: 76 61 6c 5f 69 74 65 6d 5f 6f 62 6a 2c 20 54 63  val_item_obj, Tc
dc50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
dc60: 73 6f 66 74 22 2c 20 2d 31 29 2c 20 26 72 65 73  soft", -1), &res
dc70: 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 76 61  ource_val_itemva
dc80: 6c 5f 6f 62 6a 29 3b 0a 09 09 09 69 66 20 28 74  l_obj);....if (t
dc90: 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b  cl_ret != TCL_OK
dca0: 29 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f  ) {.....Tcl_SetO
dcb0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
dcc0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
dcd0: 6a 28 22 69 6e 76 61 6c 69 64 20 72 65 71 75 65  j("invalid reque
dce0: 73 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09  st", -1));......
dcf0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
dd00: 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 63 6c 5f  );....}.....tcl_
dd10: 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64  ret = Tcl_GetWid
dd20: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 4e 55 4c 4c  eIntFromObj(NULL
dd30: 2c 20 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69  , resource_val_i
dd40: 74 65 6d 76 61 6c 5f 6f 62 6a 2c 20 26 72 65 73  temval_obj, &res
dd50: 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 29 3b  ource_val_item);
dd60: 0a 09 09 09 69 66 20 28 74 63 6c 5f 72 65 74 20  ....if (tcl_ret 
dd70: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09  != TCL_OK) {....
dd80: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
dd90: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
dda0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 76 61  wStringObj("inva
ddb0: 6c 69 64 20 72 65 71 75 65 73 74 22 2c 20 2d 31  lid request", -1
ddc0: 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
ddd0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  TCL_ERROR);....}
dde0: 0a 0a 09 09 09 72 65 73 6f 75 72 63 65 5f 76 61  .....resource_va
ddf0: 6c 2e 72 6c 69 6d 5f 63 75 72 20 3d 20 72 65 73  l.rlim_cur = res
de00: 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 3b 0a  ource_val_item;.
de10: 0a 09 09 09 74 63 6c 5f 72 65 74 20 3d 20 54 63  ....tcl_ret = Tc
de20: 6c 5f 44 69 63 74 4f 62 6a 47 65 74 28 4e 55 4c  l_DictObjGet(NUL
de30: 4c 2c 20 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f  L, resource_val_
de40: 69 74 65 6d 5f 6f 62 6a 2c 20 54 63 6c 5f 4e 65  item_obj, Tcl_Ne
de50: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 61 72 64  wStringObj("hard
de60: 22 2c 20 2d 31 29 2c 20 26 72 65 73 6f 75 72 63  ", -1), &resourc
de70: 65 5f 76 61 6c 5f 69 74 65 6d 76 61 6c 5f 6f 62  e_val_itemval_ob
de80: 6a 29 3b 0a 09 09 09 69 66 20 28 74 63 6c 5f 72  j);....if (tcl_r
de90: 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  et != TCL_OK) {.
dea0: 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ....Tcl_SetObjRe
deb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
dec0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69  _NewStringObj("i
ded0: 6e 76 61 6c 69 64 20 72 65 71 75 65 73 74 22 2c  nvalid request",
dee0: 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72 65 74 75   -1));......retu
def0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
df00: 09 09 7d 0a 0a 09 09 09 74 63 6c 5f 72 65 74 20  ..}.....tcl_ret 
df10: 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  = Tcl_GetWideInt
df20: 46 72 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 72 65  FromObj(NULL, re
df30: 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 76  source_val_itemv
df40: 61 6c 5f 6f 62 6a 2c 20 26 72 65 73 6f 75 72 63  al_obj, &resourc
df50: 65 5f 76 61 6c 5f 69 74 65 6d 29 3b 0a 09 09 09  e_val_item);....
df60: 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54  if (tcl_ret != T
df70: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 09 54 63 6c  CL_OK) {.....Tcl
df80: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
df90: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
dfa0: 69 6e 67 4f 62 6a 28 22 69 6e 76 61 6c 69 64 20  ingObj("invalid 
dfb0: 72 65 71 75 65 73 74 22 2c 20 2d 31 29 29 3b 0a  request", -1));.
dfc0: 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  .....return(TCL_
dfd0: 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
dfe0: 09 72 65 73 6f 75 72 63 65 5f 76 61 6c 2e 72 6c  .resource_val.rl
dff0: 69 6d 5f 6d 61 78 20 3d 20 72 65 73 6f 75 72 63  im_max = resourc
e000: 65 5f 76 61 6c 5f 69 74 65 6d 3b 0a 09 09 7d 0a  e_val_item;...}.
e010: 0a 09 09 72 6c 69 6d 69 74 5f 72 65 74 20 3d 20  ...rlimit_ret = 
e020: 73 65 74 72 6c 69 6d 69 74 28 72 65 73 6f 75 72  setrlimit(resour
e030: 63 65 5f 69 64 2c 20 26 72 65 73 6f 75 72 63 65  ce_id, &resource
e040: 5f 76 61 6c 29 3b 0a 09 09 69 66 20 28 72 6c 69  _val);...if (rli
e050: 6d 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  mit_ret != 0) {.
e060: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
e070: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e080: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
e090: 74 72 6c 69 6d 69 74 28 29 20 66 61 69 6c 65 64  trlimit() failed
e0a0: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74  ", -1));.....ret
e0b0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
e0c0: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  ..}....return(TC
e0d0: 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  L_OK);..}...Tcl_
e0e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e0f0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
e100: 6e 67 4f 62 6a 28 22 69 6e 76 61 6c 69 64 20 6f  ngObj("invalid o
e110: 70 65 72 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  peration", -1));
e120: 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
e130: 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ROR);.}..static 
e140: 69 6e 74 20 74 75 61 70 69 5f 6b 6c 6f 67 63 74  int tuapi_klogct
e150: 6c 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c  l(ClientData cd,
e160: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e170: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
e180: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
e190: 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a  jv[]) {..Tcl_Obj
e1a0: 20 2a 6f 70 65 72 61 74 69 6f 6e 5f 6f 62 6a 3b   *operation_obj;
e1b0: 0a 09 63 68 61 72 20 2a 62 75 66 3b 0a 09 69 6e  ..char *buf;..in
e1c0: 74 20 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 6b  t buflen;..int k
e1d0: 6c 6f 67 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f  log_ret;...if (o
e1e0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 09 54 63 6c  bjc < 2) {...Tcl
e1f0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
e200: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
e210: 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20  ingObj("wrong # 
e220: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
e230: 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61  \"::tuapi::sysca
e240: 6c 6c 3a 3a 6b 6c 6f 67 63 74 6c 20 6f 70 65 72  ll::klogctl oper
e250: 61 74 69 6f 6e 20 2e 2e 2e 5c 22 22 2c 20 2d 31  ation ...\"", -1
e260: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  ));....return(TC
e270: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6b  L_ERROR);..}...k
e280: 6c 6f 67 5f 72 65 74 20 3d 20 6b 6c 6f 67 63 74  log_ret = klogct
e290: 6c 28 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f  l(SYSLOG_ACTION_
e2a0: 4f 50 45 4e 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  OPEN, NULL, 0);.
e2b0: 09 69 66 20 28 6b 6c 6f 67 5f 72 65 74 20 21 3d  .if (klog_ret !=
e2c0: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f   0) {...Tcl_SetO
e2d0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
e2e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
e2f0: 6a 28 22 6b 6c 6f 67 63 74 6c 28 53 59 53 4c 4f  j("klogctl(SYSLO
e300: 47 5f 41 43 54 49 4f 4e 5f 4f 50 45 4e 2c 20 2e  G_ACTION_OPEN, .
e310: 2e 2e 29 20 66 61 69 6c 65 64 22 2c 20 2d 31 29  ..) failed", -1)
e320: 29 3b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  );...return(TCL_
e330: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6f 70 65  ERROR);..}...ope
e340: 72 61 74 69 6f 6e 5f 6f 62 6a 20 3d 20 6f 62 6a  ration_obj = obj
e350: 76 5b 31 5d 3b 0a 09 73 77 69 74 63 68 20 28 74  v[1];..switch (t
e360: 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69  uapi_internal_si
e370: 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 6f 70 65  mplehash_obj(ope
e380: 72 61 74 69 6f 6e 5f 6f 62 6a 29 29 20 7b 0a 09  ration_obj)) {..
e390: 09 63 61 73 65 20 30 78 65 35 39 37 30 65 34 4c  .case 0xe5970e4L
e3a0: 55 3a 20 2f 2a 20 72 65 61 64 20 2a 2f 0a 09 09  U: /* read */...
e3b0: 09 62 75 66 6c 65 6e 20 3d 20 32 35 36 20 2a 20  .buflen = 256 * 
e3c0: 31 30 32 34 3b 0a 09 09 09 62 75 66 20 3d 20 6d  1024;....buf = m
e3d0: 61 6c 6c 6f 63 28 62 75 66 6c 65 6e 29 3b 0a 09  alloc(buflen);..
e3e0: 09 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c  ..if (buf == NUL
e3f0: 4c 29 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74  L) {.....Tcl_Set
e400: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e410: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
e420: 62 6a 28 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  bj("malloc faile
e430: 64 20 21 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  d !", -1));.....
e440: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
e450: 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6b 6c 6f  R);....}.....klo
e460: 67 5f 72 65 74 20 3d 20 6b 6c 6f 67 63 74 6c 28  g_ret = klogctl(
e470: 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f 52 45  SYSLOG_ACTION_RE
e480: 41 44 5f 41 4c 4c 2c 20 62 75 66 2c 20 62 75 66  AD_ALL, buf, buf
e490: 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6b 6c 6f  len);....if (klo
e4a0: 67 5f 72 65 74 20 3d 3d 20 2d 31 29 20 7b 0a 09  g_ret == -1) {..
e4b0: 09 09 09 66 72 65 65 28 62 75 66 29 3b 0a 0a 09  ...free(buf);...
e4c0: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
e4d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e4e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6b 6c  NewStringObj("kl
e4f0: 6f 67 63 74 6c 28 53 59 53 4c 4f 47 5f 41 43 54  ogctl(SYSLOG_ACT
e500: 49 4f 4e 5f 52 45 41 44 5f 41 4c 4c 2c 20 2e 2e  ION_READ_ALL, ..
e510: 2e 29 20 66 61 69 6c 65 64 22 2c 20 2d 31 29 29  .) failed", -1))
e520: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43  ;......return(TC
e530: 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a  L_ERROR);....}..
e540: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
e550: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e560: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
e570: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
e580: 29 20 62 75 66 2c 20 6b 6c 6f 67 5f 72 65 74 29  ) buf, klog_ret)
e590: 29 3b 0a 0a 09 09 09 66 72 65 65 28 62 75 66 29  );.....free(buf)
e5a0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c  ;.....return(TCL
e5b0: 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 30 78 33  _OK);...case 0x3
e5c0: 64 39 39 37 33 66 32 4c 55 3a 20 2f 2a 20 63 6c  d9973f2LU: /* cl
e5d0: 65 61 72 20 2a 2f 0a 09 09 09 6b 6c 6f 67 5f 72  ear */....klog_r
e5e0: 65 74 20 3d 20 6b 6c 6f 67 63 74 6c 28 53 59 53  et = klogctl(SYS
e5f0: 4c 4f 47 5f 41 43 54 49 4f 4e 5f 43 4c 45 41 52  LOG_ACTION_CLEAR
e600: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 09 09 69  , NULL, 0);....i
e610: 66 20 28 6b 6c 6f 67 5f 72 65 74 20 3d 3d 20 2d  f (klog_ret == -
e620: 31 29 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74  1) {.....Tcl_Set
e630: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e640: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
e650: 62 6a 28 22 6b 6c 6f 67 63 74 6c 28 53 59 53 4c  bj("klogctl(SYSL
e660: 4f 47 5f 41 43 54 49 4f 4e 5f 43 4c 45 41 52 2c  OG_ACTION_CLEAR,
e670: 20 2e 2e 2e 29 20 66 61 69 6c 65 64 22 2c 20 2d   ...) failed", -
e680: 31 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  1));......return
e690: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  (TCL_ERROR);....
e6a0: 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c  }.....return(TCL
e6b0: 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 30 78 32  _OK);...case 0x2
e6c0: 32 35 63 33 33 36 65 4c 55 3a 20 2f 2a 20 63 6f  25c336eLU: /* co
e6d0: 6e 73 6f 6c 65 5f 6f 6e 20 2a 2f 0a 09 09 09 6b  nsole_on */....k
e6e0: 6c 6f 67 5f 72 65 74 20 3d 20 6b 6c 6f 67 63 74  log_ret = klogct
e6f0: 6c 28 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f  l(SYSLOG_ACTION_
e700: 43 4f 4e 53 4f 4c 45 5f 4f 4e 2c 20 4e 55 4c 4c  CONSOLE_ON, NULL
e710: 2c 20 30 29 3b 0a 09 09 09 69 66 20 28 6b 6c 6f  , 0);....if (klo
e720: 67 5f 72 65 74 20 3d 3d 20 2d 31 29 20 7b 0a 09  g_ret == -1) {..
e730: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
e740: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e750: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6b 6c  NewStringObj("kl
e760: 6f 67 63 74 6c 28 53 59 53 4c 4f 47 5f 41 43 54  ogctl(SYSLOG_ACT
e770: 49 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f 4f 4e 2c 20  ION_CONSOLE_ON, 
e780: 2e 2e 2e 29 20 66 61 69 6c 65 64 22 2c 20 2d 31  ...) failed", -1
e790: 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
e7a0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  TCL_ERROR);....}
e7b0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  .....return(TCL_
e7c0: 4f 4b 29 3b 0a 09 09 63 61 73 65 20 30 78 32 65  OK);...case 0x2e
e7d0: 31 39 62 62 65 36 4c 55 3a 20 2f 2a 20 63 6f 6e  19bbe6LU: /* con
e7e0: 73 6f 6c 65 5f 6f 66 66 20 2a 2f 0a 09 09 09 6b  sole_off */....k
e7f0: 6c 6f 67 5f 72 65 74 20 3d 20 6b 6c 6f 67 63 74  log_ret = klogct
e800: 6c 28 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f  l(SYSLOG_ACTION_
e810: 43 4f 4e 53 4f 4c 45 5f 4f 46 46 2c 20 4e 55 4c  CONSOLE_OFF, NUL
e820: 4c 2c 20 30 29 3b 0a 09 09 09 69 66 20 28 6b 6c  L, 0);....if (kl
e830: 6f 67 5f 72 65 74 20 3d 3d 20 2d 31 29 20 7b 0a  og_ret == -1) {.
e840: 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ....Tcl_SetObjRe
e850: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
e860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6b  _NewStringObj("k
e870: 6c 6f 67 63 74 6c 28 53 59 53 4c 4f 47 5f 41 43  logctl(SYSLOG_AC
e880: 54 49 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f 4f 46 46  TION_CONSOLE_OFF
e890: 2c 20 2e 2e 2e 29 20 66 61 69 6c 65 64 22 2c 20  , ...) failed", 
e8a0: 2d 31 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  -1));......retur
e8b0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  n(TCL_ERROR);...
e8c0: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43  .}.....return(TC
e8d0: 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  L_OK);..}...Tcl_
e8e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e8f0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
e900: 6e 67 4f 62 6a 28 22 69 6e 76 61 6c 69 64 20 73  ngObj("invalid s
e910: 75 62 63 6f 6d 6d 61 6e 64 22 2c 20 2d 31 29 29  ubcommand", -1))
e920: 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ;...return(TCL_E
e930: 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  RROR);.}..static
e940: 20 69 6e 74 20 74 75 61 70 69 5f 77 61 69 74 70   int tuapi_waitp
e950: 69 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64  id(ClientData cd
e960: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
e970: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
e980: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
e990: 62 6a 76 5b 5d 29 20 7b 0a 09 70 69 64 5f 74 20  bjv[]) {..pid_t 
e9a0: 63 68 69 6c 64 3b 0a 09 69 6e 74 20 73 74 61 74  child;..int stat
e9b0: 75 73 3b 0a 0a 09 63 68 69 6c 64 20 3d 20 77 61  us;...child = wa
e9c0: 69 74 70 69 64 28 2d 31 2c 20 26 73 74 61 74 75  itpid(-1, &statu
e9d0: 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a 09 69 66  s, WNOHANG);..if
e9e0: 20 28 63 68 69 6c 64 20 3c 20 30 29 20 7b 0a 09   (child < 0) {..
e9f0: 09 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 43  .if (errno != EC
ea00: 48 49 4c 44 29 20 7b 0a 09 09 09 54 63 6c 5f 53  HILD) {....Tcl_S
ea10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ea20: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
ea30: 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72  gObj(strerror(er
ea40: 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  rno), -1));.....
ea50: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
ea60: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
ea70: 09 63 68 69 6c 64 20 3d 20 30 3b 0a 09 09 7d 0a  .child = 0;...}.
ea80: 09 7d 0a 0a 09 69 66 20 28 63 68 69 6c 64 20 21  .}...if (child !
ea90: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  = 0) {...Tcl_Set
eaa0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
eab0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
eac0: 4f 62 6a 28 63 68 69 6c 64 29 29 3b 0a 09 7d 0a  Obj(child));..}.
ead0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29  ..return(TCL_OK)
eae0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
eaf0: 74 75 61 70 69 5f 73 65 74 74 69 6d 65 6f 66 64  tuapi_settimeofd
eb00: 61 79 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64  ay(ClientData cd
eb10: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
eb20: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
eb30: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
eb40: 62 6a 76 5b 5d 29 20 7b 0a 09 73 74 72 75 63 74  bjv[]) {..struct
eb50: 20 74 69 6d 65 76 61 6c 20 74 76 3b 0a 09 54 63   timeval tv;..Tc
eb60: 6c 5f 57 69 64 65 49 6e 74 20 74 76 5f 73 65 63  l_WideInt tv_sec
eb70: 5f 76 61 6c 2c 20 74 76 5f 75 73 65 63 5f 76 61  _val, tv_usec_va
eb80: 6c 3b 0a 09 69 6e 74 20 73 65 74 74 69 6d 65 6f  l;..int settimeo
eb90: 66 64 61 79 5f 72 65 74 2c 20 74 63 6c 5f 72 65  fday_ret, tcl_re
eba0: 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d  t;...if (objc !=
ebb0: 20 33 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f   3) {...Tcl_SetO
ebc0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
ebd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ebe0: 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  j("wrong # args:
ebf0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74   should be \"::t
ec00: 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73  uapi::syscall::s
ec10: 65 74 74 69 6d 65 6f 66 64 61 79 20 73 65 63 6f  ettimeofday seco
ec20: 6e 64 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  nds microseconds
ec30: 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  \"", -1));....re
ec40: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
ec50: 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20  ..}...tcl_ret = 
ec60: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
ec70: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
ec80: 6a 76 5b 31 5d 2c 20 26 74 76 5f 73 65 63 5f 76  jv[1], &tv_sec_v
ec90: 61 6c 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65  al);..if (tcl_re
eca0: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
ecb0: 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29  .return(tcl_ret)
ecc0: 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d  ;..}...tcl_ret =
ecd0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
ece0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
ecf0: 62 6a 76 5b 32 5d 2c 20 26 74 76 5f 75 73 65 63  bjv[2], &tv_usec
ed00: 5f 76 61 6c 29 3b 0a 09 69 66 20 28 74 63 6c 5f  _val);..if (tcl_
ed10: 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ret != TCL_OK) {
ed20: 0a 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65  ...return(tcl_re
ed30: 74 29 3b 0a 09 7d 0a 0a 09 74 76 2e 74 76 5f 73  t);..}...tv.tv_s
ed40: 65 63 20 3d 20 74 76 5f 73 65 63 5f 76 61 6c 3b  ec = tv_sec_val;
ed50: 0a 09 74 76 2e 74 76 5f 75 73 65 63 20 3d 20 74  ..tv.tv_usec = t
ed60: 76 5f 75 73 65 63 5f 76 61 6c 3b 20 0a 0a 09 73  v_usec_val; ...s
ed70: 65 74 74 69 6d 65 6f 66 64 61 79 5f 72 65 74 20  ettimeofday_ret 
ed80: 3d 20 73 65 74 74 69 6d 65 6f 66 64 61 79 28 26  = settimeofday(&
ed90: 74 76 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  tv, NULL);...if 
eda0: 28 73 65 74 74 69 6d 65 6f 66 64 61 79 5f 72 65  (settimeofday_re
edb0: 74 20 3c 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53  t < 0) {...Tcl_S
edc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
edd0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
ede0: 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72  gObj(strerror(er
edf0: 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  rno), -1));....r
ee00: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
ee10: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43  ;..}...return(TC
ee20: 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  L_OK);.}..#ifnde
ee30: 66 20 44 49 53 41 42 4c 45 5f 55 4e 49 58 5f 53  f DISABLE_UNIX_S
ee40: 4f 43 4b 45 54 53 0a 73 74 72 75 63 74 20 74 75  OCKETS.struct tu
ee50: 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
ee60: 5f 63 68 61 6e 5f 69 64 20 7b 0a 09 69 6e 74 20  _chan_id {..int 
ee70: 66 64 3b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c  fd;..Tcl_Channel
ee80: 20 63 68 61 6e 3b 0a 7d 3b 0a 0a 73 74 61 74 69   chan;.};..stati
ee90: 63 20 69 6e 74 20 74 75 61 70 69 5f 73 6f 63 6b  c int tuapi_sock
eea0: 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 63 6c  et_unix__chan_cl
eeb0: 6f 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  ose(ClientData i
eec0: 64 5f 70 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  d_p, Tcl_Interp 
eed0: 2a 69 6e 74 65 72 70 29 20 7b 0a 09 73 74 72 75  *interp) {..stru
eee0: 63 74 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f  ct tuapi_socket_
eef0: 75 6e 69 78 5f 5f 63 68 61 6e 5f 69 64 20 2a 69  unix__chan_id *i
ef00: 64 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 69 64  d;..int fd;...id
ef10: 20 3d 20 69 64 5f 70 3b 0a 0a 09 66 64 20 3d 20   = id_p;...fd = 
ef20: 69 64 2d 3e 66 64 3b 0a 0a 09 63 6c 6f 73 65 28  id->fd;...close(
ef30: 66 64 29 3b 0a 0a 09 66 72 65 65 28 69 64 29 3b  fd);...free(id);
ef40: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
ef50: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70  .static int tuap
ef60: 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63  i_socket_unix__c
ef70: 68 61 6e 5f 72 65 61 64 28 43 6c 69 65 6e 74 44  han_read(ClientD
ef80: 61 74 61 20 69 64 5f 70 2c 20 63 68 61 72 20 2a  ata id_p, char *
ef90: 62 75 66 2c 20 69 6e 74 20 62 75 66 73 69 7a 65  buf, int bufsize
efa0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
efb0: 50 74 72 29 20 7b 0a 09 73 74 72 75 63 74 20 74  Ptr) {..struct t
efc0: 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78  uapi_socket_unix
efd0: 5f 5f 63 68 61 6e 5f 69 64 20 2a 69 64 3b 0a 09  __chan_id *id;..
efe0: 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74  ssize_t read_ret
eff0: 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 69 6e 74 20  ;..int fd;..int 
f000: 72 65 74 76 61 6c 3b 0a 0a 09 69 64 20 3d 20 69  retval;...id = i
f010: 64 5f 70 3b 0a 0a 09 66 64 20 3d 20 69 64 2d 3e  d_p;...fd = id->
f020: 66 64 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  fd;...read_ret =
f030: 20 72 65 61 64 28 66 64 2c 20 62 75 66 2c 20 62   read(fd, buf, b
f040: 75 66 73 69 7a 65 29 3b 0a 09 69 66 20 28 72 65  ufsize);..if (re
f050: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
f060: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
f070: 65 72 72 6e 6f 3b 0a 0a 09 09 72 65 74 75 72 6e  errno;....return
f080: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  (-1);..}...retva
f090: 6c 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09  l = read_ret;...
f0a0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
f0b0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
f0c0: 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
f0d0: 5f 63 68 61 6e 5f 77 72 69 74 65 28 43 6c 69 65  _chan_write(Clie
f0e0: 6e 74 44 61 74 61 20 69 64 5f 70 2c 20 63 6f 6e  ntData id_p, con
f0f0: 73 74 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e  st char *buf, in
f100: 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a  t toWrite, int *
f110: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a  errorCodePtr) {.
f120: 09 73 74 72 75 63 74 20 74 75 61 70 69 5f 73 6f  .struct tuapi_so
f130: 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f  cket_unix__chan_
f140: 69 64 20 2a 69 64 3b 0a 09 73 73 69 7a 65 5f 74  id *id;..ssize_t
f150: 20 77 72 69 74 65 5f 72 65 74 3b 0a 09 69 6e 74   write_ret;..int
f160: 20 66 64 3b 0a 09 69 6e 74 20 62 79 74 65 73 57   fd;..int bytesW
f170: 72 69 74 74 65 6e 3b 0a 0a 09 69 64 20 3d 20 69  ritten;...id = i
f180: 64 5f 70 3b 0a 0a 09 66 64 20 3d 20 69 64 2d 3e  d_p;...fd = id->
f190: 66 64 3b 0a 0a 09 62 79 74 65 73 57 72 69 74 74  fd;...bytesWritt
f1a0: 65 6e 20 3d 20 30 3b 0a 09 77 68 69 6c 65 20 28  en = 0;..while (
f1b0: 74 6f 57 72 69 74 65 29 20 7b 0a 09 09 77 72 69  toWrite) {...wri
f1c0: 74 65 5f 72 65 74 20 3d 20 77 72 69 74 65 28 66  te_ret = write(f
f1d0: 64 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 65 29  d, buf, toWrite)
f1e0: 3b 0a 09 09 69 66 20 28 77 72 69 74 65 5f 72 65  ;...if (write_re
f1f0: 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 72 65  t == 0) {....bre
f200: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 77  ak;...}....if (w
f210: 72 69 74 65 5f 72 65 74 20 3c 20 30 29 20 7b 0a  rite_ret < 0) {.
f220: 09 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
f230: 20 3d 20 65 72 72 6e 6f 3b 0a 0a 09 09 09 72 65   = errno;.....re
f240: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
f250: 09 74 6f 57 72 69 74 65 20 2d 3d 20 77 72 69 74  .toWrite -= writ
f260: 65 5f 72 65 74 3b 0a 09 09 62 75 66 20 2b 3d 20  e_ret;...buf += 
f270: 77 72 69 74 65 5f 72 65 74 3b 0a 09 09 62 79 74  write_ret;...byt
f280: 65 73 57 72 69 74 74 65 6e 20 2b 3d 20 77 72 69  esWritten += wri
f290: 74 65 5f 72 65 74 3b 0a 09 7d 0a 0a 09 69 66 20  te_ret;..}...if 
f2a0: 28 62 79 74 65 73 57 72 69 74 74 65 6e 20 3d 3d  (bytesWritten ==
f2b0: 20 30 29 20 7b 0a 09 09 2a 65 72 72 6f 72 43 6f   0) {...*errorCo
f2c0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
f2d0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f2e0: 7d 0a 0a 09 72 65 74 75 72 6e 28 62 79 74 65 73  }...return(bytes
f2f0: 57 72 69 74 74 65 6e 29 3b 0a 7d 0a 0a 73 74 61  Written);.}..sta
f300: 74 69 63 20 76 6f 69 64 20 74 75 61 70 69 5f 73  tic void tuapi_s
f310: 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e  ocket_unix__chan
f320: 5f 65 76 65 6e 74 68 61 6e 64 6c 65 72 28 43 6c  _eventhandler(Cl
f330: 69 65 6e 74 44 61 74 61 20 69 64 5f 70 2c 20 69  ientData id_p, i
f340: 6e 74 20 6d 61 73 6b 29 20 7b 0a 09 73 74 72 75  nt mask) {..stru
f350: 63 74 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f  ct tuapi_socket_
f360: 75 6e 69 78 5f 5f 63 68 61 6e 5f 69 64 20 2a 69  unix__chan_id *i
f370: 64 3b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  d;..Tcl_Channel 
f380: 63 68 61 6e 3b 0a 0a 09 69 64 20 3d 20 69 64 5f  chan;...id = id_
f390: 70 3b 0a 0a 09 63 68 61 6e 20 3d 20 69 64 2d 3e  p;...chan = id->
f3a0: 63 68 61 6e 3b 0a 0a 09 69 66 20 28 21 63 68 61  chan;...if (!cha
f3b0: 6e 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  n) {...return;..
f3c0: 7d 0a 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68  }...Tcl_NotifyCh
f3d0: 61 6e 6e 65 6c 28 63 68 61 6e 2c 20 6d 61 73 6b  annel(chan, mask
f3e0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
f3f0: 64 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75  d tuapi_socket_u
f400: 6e 69 78 5f 5f 63 68 61 6e 5f 77 61 74 63 68 28  nix__chan_watch(
f410: 43 6c 69 65 6e 74 44 61 74 61 20 69 64 5f 70 2c  ClientData id_p,
f420: 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 09 73 74   int mask) {..st
f430: 72 75 63 74 20 74 75 61 70 69 5f 73 6f 63 6b 65  ruct tuapi_socke
f440: 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 69 64 20  t_unix__chan_id 
f450: 2a 69 64 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09  *id;..int fd;...
f460: 69 64 20 3d 20 69 64 5f 70 3b 0a 0a 09 66 64 20  id = id_p;...fd 
f470: 3d 20 69 64 2d 3e 66 64 3b 0a 0a 09 54 63 6c 5f  = id->fd;...Tcl_
f480: 43 72 65 61 74 65 46 69 6c 65 48 61 6e 64 6c 65  CreateFileHandle
f490: 72 28 66 64 2c 20 6d 61 73 6b 2c 20 74 75 61 70  r(fd, mask, tuap
f4a0: 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63  i_socket_unix__c
f4b0: 68 61 6e 5f 65 76 65 6e 74 68 61 6e 64 6c 65 72  han_eventhandler
f4c0: 2c 20 69 64 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  , id);...return;
f4d0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
f4e0: 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78  uapi_socket_unix
f4f0: 5f 5f 63 68 61 6e 5f 67 65 74 68 61 6e 64 6c 65  __chan_gethandle
f500: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 64 5f 70  (ClientData id_p
f510: 2c 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c  , int direction,
f520: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e   ClientData *han
f530: 64 6c 65 50 74 72 29 20 7b 0a 09 73 74 72 75 63  dlePtr) {..struc
f540: 74 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75  t tuapi_socket_u
f550: 6e 69 78 5f 5f 63 68 61 6e 5f 69 64 20 2a 69 64  nix__chan_id *id
f560: 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 43 6c 69 65  ;..int fd;..Clie
f570: 6e 74 44 61 74 61 20 66 64 5f 63 64 3b 0a 0a 09  ntData fd_cd;...
f580: 69 64 20 3d 20 69 64 5f 70 3b 0a 0a 09 66 64 20  id = id_p;...fd 
f590: 3d 20 69 64 2d 3e 66 64 3b 0a 0a 09 6d 65 6d 63  = id->fd;...memc
f5a0: 70 79 28 26 66 64 5f 63 64 2c 20 26 66 64 2c 20  py(&fd_cd, &fd, 
f5b0: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 09 2a  sizeof(fd));...*
f5c0: 68 61 6e 64 6c 65 50 74 72 20 3d 20 66 64 5f 63  handlePtr = fd_c
f5d0: 64 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  d;...return(TCL_
f5e0: 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54  OK);.}..static T
f5f0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 74 75 61 70 69  cl_Channel tuapi
f600: 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 73 6f 63  _socket_unix_soc
f610: 6b 32 74 63 6c 63 68 61 6e 28 69 6e 74 20 73 6f  k2tclchan(int so
f620: 63 6b 29 20 7b 0a 09 73 74 72 75 63 74 20 74 75  ck) {..struct tu
f630: 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
f640: 5f 63 68 61 6e 5f 69 64 20 2a 69 64 3b 0a 09 73  _chan_id *id;..s
f650: 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65  tatic Tcl_Channe
f660: 6c 54 79 70 65 20 74 63 6c 5f 63 68 61 6e 5f 74  lType tcl_chan_t
f670: 79 70 65 3b 0a 09 73 74 61 74 69 63 20 69 6e 74  ype;..static int
f680: 20 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65 5f 69   tcl_chan_type_i
f690: 6e 69 74 20 3d 20 30 3b 0a 09 54 63 6c 5f 43 68  nit = 0;..Tcl_Ch
f6a0: 61 6e 6e 65 6c 20 74 63 6c 5f 63 68 61 6e 3b 0a  annel tcl_chan;.
f6b0: 09 63 68 61 72 20 63 68 61 6e 5f 6e 61 6d 65 5b  .char chan_name[
f6c0: 33 32 5d 3b 0a 09 69 6e 74 20 73 6f 63 6b 5f 66  32];..int sock_f
f6d0: 6c 61 67 73 3b 0a 0a 09 69 66 20 28 21 74 63 6c  lags;...if (!tcl
f6e0: 5f 63 68 61 6e 5f 74 79 70 65 5f 69 6e 69 74 29  _chan_type_init)
f6f0: 20 7b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74 79   {...tcl_chan_ty
f700: 70 65 2e 74 79 70 65 4e 61 6d 65 20 3d 20 22 73  pe.typeName = "s
f710: 6f 63 6b 65 74 22 3b 0a 09 09 74 63 6c 5f 63 68  ocket";...tcl_ch
f720: 61 6e 5f 74 79 70 65 2e 76 65 72 73 69 6f 6e 20  an_type.version 
f730: 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45  = TCL_CHANNEL_VE
f740: 52 53 49 4f 4e 5f 32 3b 0a 09 09 74 63 6c 5f 63  RSION_2;...tcl_c
f750: 68 61 6e 5f 74 79 70 65 2e 63 6c 6f 73 65 50 72  han_type.closePr
f760: 6f 63 20 3d 20 74 75 61 70 69 5f 73 6f 63 6b 65  oc = tuapi_socke
f770: 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 63 6c 6f  t_unix__chan_clo
f780: 73 65 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74  se;...tcl_chan_t
f790: 79 70 65 2e 69 6e 70 75 74 50 72 6f 63 20 3d 20  ype.inputProc = 
f7a0: 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69  tuapi_socket_uni
f7b0: 78 5f 5f 63 68 61 6e 5f 72 65 61 64 3b 0a 09 09  x__chan_read;...
f7c0: 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65 2e 6f 75  tcl_chan_type.ou
f7d0: 74 70 75 74 50 72 6f 63 20 3d 20 74 75 61 70 69  tputProc = tuapi
f7e0: 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68  _socket_unix__ch
f7f0: 61 6e 5f 77 72 69 74 65 3b 0a 09 09 74 63 6c 5f  an_write;...tcl_
f800: 63 68 61 6e 5f 74 79 70 65 2e 77 61 74 63 68 50  chan_type.watchP
f810: 72 6f 63 20 3d 20 74 75 61 70 69 5f 73 6f 63 6b  roc = tuapi_sock
f820: 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 77 61  et_unix__chan_wa
f830: 74 63 68 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f  tch;...tcl_chan_
f840: 74 79 70 65 2e 67 65 74 48 61 6e 64 6c 65 50 72  type.getHandlePr
f850: 6f 63 20 3d 20 74 75 61 70 69 5f 73 6f 63 6b 65  oc = tuapi_socke
f860: 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 67 65 74  t_unix__chan_get
f870: 68 61 6e 64 6c 65 3b 0a 09 09 74 63 6c 5f 63 68  handle;...tcl_ch
f880: 61 6e 5f 74 79 70 65 2e 73 65 65 6b 50 72 6f 63  an_type.seekProc
f890: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 74 63 6c 5f 63   = NULL;...tcl_c
f8a0: 68 61 6e 5f 74 79 70 65 2e 73 65 74 4f 70 74 69  han_type.setOpti
f8b0: 6f 6e 50 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09  onProc = NULL;..
f8c0: 09 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65 2e 67  .tcl_chan_type.g
f8d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 4e  etOptionProc = N
f8e0: 55 4c 4c 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f  ULL;...tcl_chan_
f8f0: 74 79 70 65 2e 63 6c 6f 73 65 32 50 72 6f 63 20  type.close2Proc 
f900: 3d 20 4e 55 4c 4c 3b 0a 09 09 74 63 6c 5f 63 68  = NULL;...tcl_ch
f910: 61 6e 5f 74 79 70 65 2e 62 6c 6f 63 6b 4d 6f 64  an_type.blockMod
f920: 65 50 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eProc = NULL;...
f930: 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65 2e 66 6c  tcl_chan_type.fl
f940: 75 73 68 50 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a  ushProc = NULL;.
f950: 09 09 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65 2e  ..tcl_chan_type.
f960: 68 61 6e 64 6c 65 72 50 72 6f 63 20 3d 20 4e 55  handlerProc = NU
f970: 4c 4c 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74  LL;...tcl_chan_t
f980: 79 70 65 2e 77 69 64 65 53 65 65 6b 50 72 6f 63  ype.wideSeekProc
f990: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 74 63 6c 5f 63   = NULL;...tcl_c
f9a0: 68 61 6e 5f 74 79 70 65 2e 74 68 72 65 61 64 41  han_type.threadA
f9b0: 63 74 69 6f 6e 50 72 6f 63 20 3d 20 4e 55 4c 4c  ctionProc = NULL
f9c0: 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74 79 70  ;...tcl_chan_typ
f9d0: 65 2e 74 72 75 6e 63 61 74 65 50 72 6f 63 20 3d  e.truncateProc =
f9e0: 20 4e 55 4c 4c 3b 0a 0a 09 09 74 63 6c 5f 63 68   NULL;....tcl_ch
f9f0: 61 6e 5f 74 79 70 65 5f 69 6e 69 74 20 3d 20 31  an_type_init = 1
fa00: 3b 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e 74 66 28  ;..}...snprintf(
fa10: 63 68 61 6e 5f 6e 61 6d 65 2c 20 73 69 7a 65 6f  chan_name, sizeo
fa20: 66 28 63 68 61 6e 5f 6e 61 6d 65 29 2c 20 22 73  f(chan_name), "s
fa30: 6f 63 6b 25 75 22 2c 20 73 6f 63 6b 29 3b 0a 0a  ock%u", sock);..
fa40: 09 69 64 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  .id = malloc(siz
fa50: 65 6f 66 28 2a 69 64 29 29 3b 0a 09 69 66 20 28  eof(*id));..if (
fa60: 69 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  id == NULL) {...
fa70: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
fa80: 0a 0a 09 69 64 2d 3e 66 64 20 3d 20 73 6f 63 6b  ...id->fd = sock
fa90: 3b 0a 09 69 64 2d 3e 63 68 61 6e 20 3d 20 4e 55  ;..id->chan = NU
faa0: 4c 4c 3b 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75  LL;.../* Configu
fab0: 72 65 20 73 6f 63 6b 65 74 20 61 73 20 6e 6f 6e  re socket as non
fac0: 2d 62 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 09 73 6f  -blocking */..so
fad0: 63 6b 5f 66 6c 61 67 73 20 3d 20 66 63 6e 74 6c  ck_flags = fcntl
fae0: 28 73 6f 63 6b 2c 20 46 5f 47 45 54 46 4c 2c 20  (sock, F_GETFL, 
faf0: 30 29 3b 0a 09 69 66 20 28 73 6f 63 6b 5f 66 6c  0);..if (sock_fl
fb00: 61 67 73 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 73  ags == -1) {...s
fb10: 6f 63 6b 5f 66 6c 61 67 73 20 3d 20 4f 5f 4e 4f  ock_flags = O_NO
fb20: 4e 42 4c 4f 43 4b 3b 0a 09 7d 20 65 6c 73 65 20  NBLOCK;..} else 
fb30: 7b 0a 09 09 73 6f 63 6b 5f 66 6c 61 67 73 20 7c  {...sock_flags |
fb40: 3d 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 3b 0a 09 7d  = O_NONBLOCK;..}
fb50: 0a 09 66 63 6e 74 6c 28 73 6f 63 6b 2c 20 46 5f  ..fcntl(sock, F_
fb60: 53 45 54 46 4c 2c 20 28 6c 6f 6e 67 29 20 73 6f  SETFL, (long) so
fb70: 63 6b 5f 66 6c 61 67 73 29 3b 0a 0a 09 2f 2a 20  ck_flags);.../* 
fb80: 43 72 65 61 74 65 20 74 68 65 20 63 68 61 6e 6e  Create the chann
fb90: 65 6c 20 2a 2f 0a 09 74 63 6c 5f 63 68 61 6e 20  el */..tcl_chan 
fba0: 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e  = Tcl_CreateChan
fbb0: 6e 65 6c 28 26 74 63 6c 5f 63 68 61 6e 5f 74 79  nel(&tcl_chan_ty
fbc0: 70 65 2c 20 63 68 61 6e 5f 6e 61 6d 65 2c 20 69  pe, chan_name, i
fbd0: 64 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  d, TCL_READABLE 
fbe0: 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b  | TCL_WRITABLE);
fbf0: 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .../* Update the
fc00: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
fc10: 64 20 74 6f 20 65 61 63 68 20 66 75 6e 63 74 69  d to each functi
fc20: 6f 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  on to include th
fc30: 65 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a  e channel name *
fc40: 2f 0a 09 69 64 2d 3e 63 68 61 6e 20 3d 20 74 63  /..id->chan = tc
fc50: 6c 5f 63 68 61 6e 3b 0a 0a 09 72 65 74 75 72 6e  l_chan;...return
fc60: 28 74 63 6c 5f 63 68 61 6e 29 3b 0a 7d 0a 0a 73  (tcl_chan);.}..s
fc70: 74 72 75 63 74 20 74 75 61 70 69 5f 73 6f 63 6b  truct tuapi_sock
fc80: 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 61 63  et_unix__chan_ac
fc90: 63 65 70 74 5f 63 64 20 7b 0a 09 69 6e 74 20 66  cept_cd {..int f
fca0: 64 3b 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a  d;..Tcl_Interp *
fcb0: 69 6e 74 65 72 70 3b 0a 09 54 63 6c 5f 4f 62 6a  interp;..Tcl_Obj
fcc0: 20 2a 63 6f 6d 6d 61 6e 64 3b 0a 7d 3b 0a 0a 73   *command;.};..s
fcd0: 74 61 74 69 63 20 76 6f 69 64 20 74 75 61 70 69  tatic void tuapi
fce0: 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68  _socket_unix__ch
fcf0: 61 6e 5f 61 63 63 65 70 74 28 43 6c 69 65 6e 74  an_accept(Client
fd00: 44 61 74 61 20 63 64 5f 70 2c 20 69 6e 74 20 6d  Data cd_p, int m
fd10: 61 73 6b 29 20 7b 0a 09 73 74 72 75 63 74 20 74  ask) {..struct t
fd20: 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78  uapi_socket_unix
fd30: 5f 5f 63 68 61 6e 5f 61 63 63 65 70 74 5f 63 64  __chan_accept_cd
fd40: 20 2a 63 64 3b 0a 09 54 63 6c 5f 49 6e 74 65 72   *cd;..Tcl_Inter
fd50: 70 20 2a 69 6e 74 65 72 70 3b 0a 09 54 63 6c 5f  p *interp;..Tcl_
fd60: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 09 54  Channel chan;..T
fd70: 63 6c 5f 4f 62 6a 20 2a 63 6f 6d 6d 61 6e 64 2c  cl_Obj *command,
fd80: 20 2a 63 6f 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e   *command_to_run
fd90: 5f 6f 62 6a 73 5b 35 5d 2c 20 2a 63 6f 6d 6d 61  _objs[5], *comma
fda0: 6e 64 5f 74 6f 5f 72 75 6e 3b 0a 09 69 6e 74 20  nd_to_run;..int 
fdb0: 73 65 74 73 6f 63 6b 6f 70 74 5f 72 65 74 3b 0a  setsockopt_ret;.
fdc0: 09 69 6e 74 20 70 61 73 73 5f 63 72 65 64 73 5f  .int pass_creds_
fdd0: 74 72 75 65 20 3d 20 31 3b 0a 09 69 6e 74 20 66  true = 1;..int f
fde0: 64 3b 0a 09 69 6e 74 20 73 6f 63 6b 3b 0a 0a 09  d;..int sock;...
fdf0: 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f  if ((mask & TCL_
fe00: 52 45 41 44 41 42 4c 45 29 20 21 3d 20 54 43 4c  READABLE) != TCL
fe10: 5f 52 45 41 44 41 42 4c 45 29 20 7b 0a 09 09 72  _READABLE) {...r
fe20: 65 74 75 72 6e 3b 0a 09 7d 0a 09 0a 09 63 64 20  eturn;..}....cd 
fe30: 3d 20 63 64 5f 70 3b 0a 0a 09 66 64 20 3d 20 63  = cd_p;...fd = c
fe40: 64 2d 3e 66 64 3b 0a 09 69 6e 74 65 72 70 20 3d  d->fd;..interp =
fe50: 20 63 64 2d 3e 69 6e 74 65 72 70 3b 0a 09 63 6f   cd->interp;..co
fe60: 6d 6d 61 6e 64 20 3d 20 63 64 2d 3e 63 6f 6d 6d  mmand = cd->comm
fe70: 61 6e 64 3b 0a 0a 09 73 6f 63 6b 20 3d 20 61 63  and;...sock = ac
fe80: 63 65 70 74 28 66 64 2c 20 4e 55 4c 4c 2c 20 4e  cept(fd, NULL, N
fe90: 55 4c 4c 29 3b 0a 09 69 66 20 28 73 6f 63 6b 20  ULL);..if (sock 
fea0: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  < 0) {...return;
feb0: 0a 09 7d 0a 0a 09 63 68 61 6e 20 3d 20 74 75 61  ..}...chan = tua
fec0: 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 73  pi_socket_unix_s
fed0: 6f 63 6b 32 74 63 6c 63 68 61 6e 28 73 6f 63 6b  ock2tclchan(sock
fee0: 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20  );..if (chan == 
fef0: 4e 55 4c 4c 29 20 7b 0a 09 09 63 6c 6f 73 65 28  NULL) {...close(
ff00: 73 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  sock);....return
ff10: 3b 0a 09 7d 0a 0a 09 73 65 74 73 6f 63 6b 6f 70  ;..}...setsockop
ff20: 74 5f 72 65 74 20 3d 20 73 65 74 73 6f 63 6b 6f  t_ret = setsocko
ff30: 70 74 28 73 6f 63 6b 2c 20 53 4f 4c 5f 53 4f 43  pt(sock, SOL_SOC
ff40: 4b 45 54 2c 20 53 4f 5f 50 41 53 53 43 52 45 44  KET, SO_PASSCRED
ff50: 2c 20 26 70 61 73 73 5f 63 72 65 64 73 5f 74 72  , &pass_creds_tr
ff60: 75 65 2c 20 73 69 7a 65 6f 66 28 70 61 73 73 5f  ue, sizeof(pass_
ff70: 63 72 65 64 73 5f 74 72 75 65 29 29 3b 0a 09 69  creds_true));..i
ff80: 66 20 28 73 65 74 73 6f 63 6b 6f 70 74 5f 72 65  f (setsockopt_re
ff90: 74 20 21 3d 20 30 29 20 7b 0a 09 09 63 6c 6f 73  t != 0) {...clos
ffa0: 65 28 73 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  e(sock);....retu
ffb0: 72 6e 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 52 65 67  rn;..}...Tcl_Reg
ffc0: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74  isterChannel(int
ffd0: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 0a 09 63 6f  erp, chan);...co
ffe0: 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e 5f 6f 62 6a  mmand_to_run_obj
fff0: 73 5b 30 5d 20 3d 20 63 6f 6d 6d 61 6e 64 3b 0a  s[0] = command;.
10000 09 63 6f 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e 5f  .command_to_run_
10010 6f 62 6a 73 5b 31 5d 20 3d 20 54 63 6c 5f 4e 65  objs[1] = Tcl_Ne
10020 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
10030 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
10040 61 6e 29 2c 20 2d 31 29 3b 0a 09 63 6f 6d 6d 61  an), -1);..comma
10050 6e 64 5f 74 6f 5f 72 75 6e 5f 6f 62 6a 73 5b 32  nd_to_run_objs[2
10060 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ] = Tcl_NewStrin
10070 67 4f 62 6a 28 22 2e 2e 2e 75 69 64 2e 2e 2e 22  gObj("...uid..."
10080 2c 20 2d 31 29 3b 20 2f 2a 20 58 58 58 3a 20 54  , -1); /* XXX: T
10090 4f 44 4f 20 2a 2f 0a 09 63 6f 6d 6d 61 6e 64 5f  ODO */..command_
100a0 74 6f 5f 72 75 6e 5f 6f 62 6a 73 5b 33 5d 20 3d  to_run_objs[3] =
100b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
100c0 6a 28 22 2e 2e 2e 67 69 64 2e 2e 2e 22 2c 20 2d  j("...gid...", -
100d0 31 29 3b 20 2f 2a 20 58 58 58 3a 20 54 4f 44 4f  1); /* XXX: TODO
100e0 20 2a 2f 0a 09 63 6f 6d 6d 61 6e 64 5f 74 6f 5f   */..command_to_
100f0 72 75 6e 5f 6f 62 6a 73 5b 34 5d 20 3d 20 54 63  run_objs[4] = Tc
10100 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10110 2e 2e 2e 70 69 64 2e 2e 2e 22 2c 20 2d 31 29 3b  ...pid...", -1);
10120 20 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f   /* XXX: TODO */
10130 0a 09 63 6f 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e  ..command_to_run
10140 20 3d 20 54 63 6c 5f 43 6f 6e 63 61 74 4f 62 6a   = Tcl_ConcatObj
10150 28 73 69 7a 65 6f 66 28 63 6f 6d 6d 61 6e 64 5f  (sizeof(command_
10160 74 6f 5f 72 75 6e 5f 6f 62 6a 73 29 20 2f 20 73  to_run_objs) / s
10170 69 7a 65 6f 66 28 63 6f 6d 6d 61 6e 64 5f 74 6f  izeof(command_to
10180 5f 72 75 6e 5f 6f 62 6a 73 5b 30 5d 29 2c 20 63  _run_objs[0]), c
10190 6f 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e 5f 6f 62  ommand_to_run_ob
101a0 6a 73 29 3b 0a 0a 09 54 63 6c 5f 45 76 61 6c 4f  js);...Tcl_EvalO
101b0 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6f 6d  bjEx(interp, com
101c0 6d 61 6e 64 5f 74 6f 5f 72 75 6e 2c 20 54 43 4c  mand_to_run, TCL
101d0 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 0a  _EVAL_GLOBAL);..
101e0 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
101f0 69 63 20 69 6e 74 20 74 75 61 70 69 5f 73 6f 63  ic int tuapi_soc
10200 6b 65 74 5f 75 6e 69 78 5f 73 65 72 76 65 72 28  ket_unix_server(
10210 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54  ClientData cd, T
10220 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10230 70 2c 20 69 6e 74 20 73 6f 63 6b 2c 20 63 6f 6e  p, int sock, con
10240 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 54  st char *path, T
10250 63 6c 5f 4f 62 6a 20 2a 63 6f 6d 6d 61 6e 64 29  cl_Obj *command)
10260 20 7b 0a 09 73 74 72 75 63 74 20 74 75 61 70 69   {..struct tuapi
10270 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68  _socket_unix__ch
10280 61 6e 5f 61 63 63 65 70 74 5f 63 64 20 2a 61 63  an_accept_cd *ac
10290 63 65 70 74 5f 63 64 3b 0a 09 73 74 72 75 63 74  cept_cd;..struct
102a0 20 73 6f 63 6b 61 64 64 72 5f 75 6e 20 64 65 73   sockaddr_un des
102b0 74 3b 0a 09 73 73 69 7a 65 5f 74 20 70 61 74 68  t;..ssize_t path
102c0 6c 65 6e 3b 0a 09 69 6e 74 20 62 69 6e 64 5f 72  len;..int bind_r
102d0 65 74 2c 20 6c 69 73 74 65 6e 5f 72 65 74 3b 0a  et, listen_ret;.
102e0 0a 09 70 61 74 68 6c 65 6e 20 3d 20 73 74 72 6c  ..pathlen = strl
102f0 65 6e 28 70 61 74 68 29 20 2b 20 31 3b 0a 09 69  en(path) + 1;..i
10300 66 20 28 70 61 74 68 6c 65 6e 20 3c 3d 20 30 29  f (pathlen <= 0)
10310 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
10320 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
10330 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10340 70 61 74 68 20 74 6f 6f 20 73 68 6f 72 74 22 2c  path too short",
10350 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
10360 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
10370 0a 09 69 66 20 28 70 61 74 68 6c 65 6e 20 3e 20  ..if (pathlen > 
10380 73 69 7a 65 6f 66 28 64 65 73 74 2e 73 75 6e 5f  sizeof(dest.sun_
10390 70 61 74 68 29 29 20 7b 0a 09 09 54 63 6c 5f 53  path)) {...Tcl_S
103a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
103b0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
103c0 67 4f 62 6a 28 22 70 61 74 68 20 74 6f 6f 20 6c  gObj("path too l
103d0 6f 6e 67 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  ong", -1));....r
103e0 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
103f0 3b 0a 09 7d 0a 0a 09 64 65 73 74 2e 73 75 6e 5f  ;..}...dest.sun_
10400 66 61 6d 69 6c 79 20 3d 20 41 46 5f 55 4e 49 58  family = AF_UNIX
10410 3b 0a 09 6d 65 6d 63 70 79 28 64 65 73 74 2e 73  ;..memcpy(dest.s
10420 75 6e 5f 70 61 74 68 2c 20 70 61 74 68 2c 20 70  un_path, path, p
10430 61 74 68 6c 65 6e 29 3b 0a 0a 09 62 69 6e 64 5f  athlen);...bind_
10440 72 65 74 20 3d 20 62 69 6e 64 28 73 6f 63 6b 2c  ret = bind(sock,
10450 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64   (struct sockadd
10460 72 20 2a 29 20 26 64 65 73 74 2c 20 73 69 7a 65  r *) &dest, size
10470 6f 66 28 64 65 73 74 29 29 3b 0a 09 69 66 20 28  of(dest));..if (
10480 62 69 6e 64 5f 72 65 74 20 21 3d 20 30 29 20 7b  bind_ret != 0) {
10490 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
104a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
104b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74 72  NewStringObj(str
104c0 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20 2d 31  error(errno), -1
104d0 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  ));....return(TC
104e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c  L_ERROR);..}...l
104f0 69 73 74 65 6e 5f 72 65 74 20 3d 20 6c 69 73 74  isten_ret = list
10500 65 6e 28 73 6f 63 6b 2c 20 32 29 3b 0a 09 69 66  en(sock, 2);..if
10510 20 28 6c 69 73 74 65 6e 5f 72 65 74 20 21 3d 20   (listen_ret != 
10520 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  0) {...Tcl_SetOb
10530 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10540 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10550 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29  (strerror(errno)
10560 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72  , -1));....retur
10570 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
10580 0a 0a 09 61 63 63 65 70 74 5f 63 64 20 3d 20 6d  ...accept_cd = m
10590 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 61 63  alloc(sizeof(*ac
105a0 63 65 70 74 5f 63 64 29 29 3b 0a 09 69 66 20 28  cept_cd));..if (
105b0 61 63 63 65 70 74 5f 63 64 20 3d 3d 20 4e 55 4c  accept_cd == NUL
105c0 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  L) {...Tcl_SetOb
105d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
105e0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
105f0 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29  (strerror(errno)
10600 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72  , -1));....retur
10610 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
10620 0a 0a 09 61 63 63 65 70 74 5f 63 64 2d 3e 66 64  ...accept_cd->fd
10630 20 3d 20 73 6f 63 6b 3b 0a 09 61 63 63 65 70 74   = sock;..accept
10640 5f 63 64 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  _cd->interp = in
10650 74 65 72 70 3b 0a 09 61 63 63 65 70 74 5f 63 64  terp;..accept_cd
10660 2d 3e 63 6f 6d 6d 61 6e 64 20 3d 20 63 6f 6d 6d  ->command = comm
10670 61 6e 64 3b 0a 0a 09 54 63 6c 5f 49 6e 63 72 52  and;...Tcl_IncrR
10680 65 66 43 6f 75 6e 74 28 63 6f 6d 6d 61 6e 64 29  efCount(command)
10690 3b 0a 0a 09 54 63 6c 5f 43 72 65 61 74 65 46 69  ;...Tcl_CreateFi
106a0 6c 65 48 61 6e 64 6c 65 72 28 73 6f 63 6b 2c 20  leHandler(sock, 
106b0 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 74 75  TCL_READABLE, tu
106c0 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
106d0 5f 63 68 61 6e 5f 61 63 63 65 70 74 2c 20 61 63  _chan_accept, ac
106e0 63 65 70 74 5f 63 64 29 3b 0a 0a 09 72 65 74 75  cept_cd);...retu
106f0 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73  rn(TCL_OK);.}..s
10700 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
10710 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 63 6c 69 65  socket_unix_clie
10720 6e 74 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64  nt(ClientData cd
10730 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
10740 74 65 72 70 2c 20 69 6e 74 20 73 6f 63 6b 2c 20  terp, int sock, 
10750 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
10760 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c  ) {..Tcl_Channel
10770 20 63 68 61 6e 3b 0a 09 73 74 72 75 63 74 20 73   chan;..struct s
10780 6f 63 6b 61 64 64 72 5f 75 6e 20 64 65 73 74 3b  ockaddr_un dest;
10790 0a 09 73 73 69 7a 65 5f 74 20 70 61 74 68 6c 65  ..ssize_t pathle
107a0 6e 3b 0a 09 69 6e 74 20 63 6f 6e 6e 65 63 74 5f  n;..int connect_
107b0 72 65 74 2c 20 73 65 74 73 6f 63 6b 6f 70 74 5f  ret, setsockopt_
107c0 72 65 74 3b 0a 09 69 6e 74 20 70 61 73 73 5f 63  ret;..int pass_c
107d0 72 65 64 73 5f 74 72 75 65 20 3d 20 31 3b 0a 0a  reds_true = 1;..
107e0 09 70 61 74 68 6c 65 6e 20 3d 20 73 74 72 6c 65  .pathlen = strle
107f0 6e 28 70 61 74 68 29 20 2b 20 31 3b 0a 09 69 66  n(path) + 1;..if
10800 20 28 70 61 74 68 6c 65 6e 20 3c 3d 20 30 29 20   (pathlen <= 0) 
10810 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
10820 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
10830 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
10840 61 74 68 20 74 6f 6f 20 73 68 6f 72 74 22 2c 20  ath too short", 
10850 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  -1));....return(
10860 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  TCL_ERROR);..}..
10870 09 69 66 20 28 70 61 74 68 6c 65 6e 20 3e 20 73  .if (pathlen > s
10880 69 7a 65 6f 66 28 64 65 73 74 2e 73 75 6e 5f 70  izeof(dest.sun_p
10890 61 74 68 29 29 20 7b 0a 09 09 54 63 6c 5f 53 65  ath)) {...Tcl_Se
108a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
108b0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
108c0 4f 62 6a 28 22 70 61 74 68 20 74 6f 6f 20 6c 6f  Obj("path too lo
108d0 6e 67 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  ng", -1));....re
108e0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
108f0 0a 09 7d 0a 0a 09 64 65 73 74 2e 73 75 6e 5f 66  ..}...dest.sun_f
10900 61 6d 69 6c 79 20 3d 20 41 46 5f 55 4e 49 58 3b  amily = AF_UNIX;
10910 0a 09 6d 65 6d 63 70 79 28 64 65 73 74 2e 73 75  ..memcpy(dest.su
10920 6e 5f 70 61 74 68 2c 20 70 61 74 68 2c 20 70 61  n_path, path, pa
10930 74 68 6c 65 6e 29 3b 0a 0a 09 63 6f 6e 6e 65 63  thlen);...connec
10940 74 5f 72 65 74 20 3d 20 63 6f 6e 6e 65 63 74 28  t_ret = connect(
10950 73 6f 63 6b 2c 20 28 73 74 72 75 63 74 20 73 6f  sock, (struct so
10960 63 6b 61 64 64 72 20 2a 29 20 26 64 65 73 74 2c  ckaddr *) &dest,
10970 20 73 69 7a 65 6f 66 28 64 65 73 74 29 29 3b 0a   sizeof(dest));.
10980 09 69 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65 74  .if (connect_ret
10990 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53   != 0) {...Tcl_S
109a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
109b0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
109c0 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72  gObj(strerror(er
109d0 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  rno), -1));....r
109e0 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
109f0 3b 0a 09 7d 0a 0a 09 73 65 74 73 6f 63 6b 6f 70  ;..}...setsockop
10a00 74 5f 72 65 74 20 3d 20 73 65 74 73 6f 63 6b 6f  t_ret = setsocko
10a10 70 74 28 73 6f 63 6b 2c 20 53 4f 4c 5f 53 4f 43  pt(sock, SOL_SOC
10a20 4b 45 54 2c 20 53 4f 5f 50 41 53 53 43 52 45 44  KET, SO_PASSCRED
10a30 2c 20 26 70 61 73 73 5f 63 72 65 64 73 5f 74 72  , &pass_creds_tr
10a40 75 65 2c 20 73 69 7a 65 6f 66 28 70 61 73 73 5f  ue, sizeof(pass_
10a50 63 72 65 64 73 5f 74 72 75 65 29 29 3b 0a 09 69  creds_true));..i
10a60 66 20 28 73 65 74 73 6f 63 6b 6f 70 74 5f 72 65  f (setsockopt_re
10a70 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  t != 0) {...Tcl_
10a80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10a90 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
10aa0 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65  ngObj(strerror(e
10ab0 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09  rrno), -1));....
10ac0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
10ad0 29 3b 0a 09 7d 0a 0a 09 63 68 61 6e 20 3d 20 74  );..}...chan = t
10ae0 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78  uapi_socket_unix
10af0 5f 73 6f 63 6b 32 74 63 6c 63 68 61 6e 28 73 6f  _sock2tclchan(so
10b00 63 6b 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  ck);..if (chan =
10b10 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f  = NULL) {...Tcl_
10b20 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10b30 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
10b40 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65 20 74 6f  ngObj("unable to
10b50 20 63 72 65 61 74 65 20 54 63 6c 20 63 68 61 6e   create Tcl chan
10b60 6e 65 6c 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  nel", -1));....r
10b70 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
10b80 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 52 65 67 69 73  ;..}...Tcl_Regis
10b90 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  terChannel(inter
10ba0 70 2c 20 63 68 61 6e 29 3b 0a 0a 09 54 63 6c 5f  p, chan);...Tcl_
10bb0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10bc0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
10bd0 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
10be0 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20  nnelName(chan), 
10bf0 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54  -1));...return(T
10c00 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69  CL_OK);.}..stati
10c10 63 20 69 6e 74 20 74 75 61 70 69 5f 73 6f 63 6b  c int tuapi_sock
10c20 65 74 5f 75 6e 69 78 28 43 6c 69 65 6e 74 44 61  et_unix(ClientDa
10c30 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  ta cd, Tcl_Inter
10c40 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
10c50 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
10c60 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54  NST objv[]) {..T
10c70 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 5f 6f 62 6a  cl_Obj *path_obj
10c80 2c 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 62 6a 3b 0a  , *command_obj;.
10c90 09 63 68 61 72 20 2a 70 61 74 68 3b 0a 09 69 6e  .char *path;..in
10ca0 74 20 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 73  t retval;..int s
10cb0 6f 63 6b 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20  ock;...if (objc 
10cc0 3c 20 32 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  < 2) {...Tcl_Set
10cd0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10ce0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10cf0 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73  bj("wrong # args
10d00 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a  : should be \"::
10d10 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a  tuapi::syscall::
10d20 73 6f 63 6b 65 74 5f 75 6e 69 78 20 70 61 74 68  socket_unix path
10d30 5c 22 20 6f 72 20 5c 22 3a 3a 74 75 61 70 69 3a  \" or \"::tuapi:
10d40 3a 73 79 73 63 61 6c 6c 3a 3a 73 6f 63 6b 65 74  :syscall::socket
10d50 5f 75 6e 69 78 20 2d 73 65 72 76 65 72 20 63 6f  _unix -server co
10d60 6d 6d 61 6e 64 20 70 61 74 68 5c 22 22 2c 20 2d  mmand path\"", -
10d70 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54  1));....return(T
10d80 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  CL_ERROR);..}...
10d90 70 61 74 68 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b  path_obj = objv[
10da0 31 5d 3b 0a 09 70 61 74 68 20 3d 20 54 63 6c 5f  1];..path = Tcl_
10db0 47 65 74 53 74 72 69 6e 67 28 70 61 74 68 5f 6f  GetString(path_o
10dc0 62 6a 29 3b 0a 0a 09 73 6f 63 6b 20 3d 20 73 6f  bj);...sock = so
10dd0 63 6b 65 74 28 41 46 5f 55 4e 49 58 2c 20 53 4f  cket(AF_UNIX, SO
10de0 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29 3b 0a 09  CK_STREAM, 0);..
10df0 69 66 20 28 73 6f 63 6b 20 3d 3d 20 2d 31 29 20  if (sock == -1) 
10e00 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
10e10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
10e20 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 74  _NewStringObj(st
10e30 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20 2d  rerror(errno), -
10e40 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54  1));....return(T
10e50 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  CL_ERROR);..}...
10e60 69 66 20 28 73 74 72 63 6d 70 28 70 61 74 68 2c  if (strcmp(path,
10e70 20 22 2d 73 65 72 76 65 72 22 29 20 3d 3d 20 30   "-server") == 0
10e80 29 20 7b 0a 09 09 69 66 20 28 6f 62 6a 63 20 21  ) {...if (objc !
10e90 3d 20 34 29 20 7b 0a 09 09 09 54 63 6c 5f 53 65  = 4) {....Tcl_Se
10ea0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10eb0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
10ec0 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67  Obj("wrong # arg
10ed0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a  s: should be \":
10ee0 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a  :tuapi::syscall:
10ef0 3a 73 6f 63 6b 65 74 5f 75 6e 69 78 20 2d 73 65  :socket_unix -se
10f00 72 76 65 72 20 63 6f 6d 6d 61 6e 64 20 70 61 74  rver command pat
10f10 68 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  h\"", -1));.....
10f20 63 6c 6f 73 65 28 73 6f 63 6b 29 3b 0a 0a 09 09  close(sock);....
10f30 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
10f40 52 29 3b 0a 09 09 7d 0a 0a 09 09 63 6f 6d 6d 61  R);...}....comma
10f50 6e 64 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 32 5d  nd_obj = objv[2]
10f60 3b 0a 09 09 70 61 74 68 5f 6f 62 6a 20 3d 20 6f  ;...path_obj = o
10f70 62 6a 76 5b 33 5d 3b 0a 0a 09 09 70 61 74 68 20  bjv[3];....path 
10f80 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
10f90 70 61 74 68 5f 6f 62 6a 29 3b 0a 0a 09 09 72 65  path_obj);....re
10fa0 74 76 61 6c 20 3d 20 74 75 61 70 69 5f 73 6f 63  tval = tuapi_soc
10fb0 6b 65 74 5f 75 6e 69 78 5f 73 65 72 76 65 72 28  ket_unix_server(
10fc0 63 64 2c 20 69 6e 74 65 72 70 2c 20 73 6f 63 6b  cd, interp, sock
10fd0 2c 20 70 61 74 68 2c 20 63 6f 6d 6d 61 6e 64 5f  , path, command_
10fe0 6f 62 6a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  obj);..} else {.
10ff0 09 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29  ..if (objc != 2)
11000 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a   {....Tcl_SetObj
11010 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
11020 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11030 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11040 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61  hould be \"::tua
11050 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 6f 63  pi::syscall::soc
11060 6b 65 74 5f 75 6e 69 78 20 70 61 74 68 5c 22 22  ket_unix path\""
11070 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 63 6c 6f 73  , -1));.....clos
11080 65 28 73 6f 63 6b 29 3b 0a 0a 09 09 09 72 65 74  e(sock);.....ret
11090 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
110a0 09 09 7d 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20  ..}....retval = 
110b0 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69  tuapi_socket_uni
110c0 78 5f 63 6c 69 65 6e 74 28 63 64 2c 20 69 6e 74  x_client(cd, int
110d0 65 72 70 2c 20 73 6f 63 6b 2c 20 70 61 74 68 29  erp, sock, path)
110e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61  ;..}...if (retva
110f0 6c 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  l != TCL_OK) {..
11100 09 63 6c 6f 73 65 28 73 6f 63 6b 29 3b 0a 09 7d  .close(sock);..}
11110 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
11120 29 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69  );.}.#else.stati
11130 63 20 69 6e 74 20 74 75 61 70 69 5f 73 6f 63 6b  c int tuapi_sock
11140 65 74 5f 75 6e 69 78 28 43 6c 69 65 6e 74 44 61  et_unix(ClientDa
11150 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  ta cd, Tcl_Inter
11160 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
11170 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
11180 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54  NST objv[]) {..T
11190 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
111a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
111b0 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 20 69 6d  tringObj("not im
111c0 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29  plemented", -1))
111d0 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
111e0 52 4f 52 29 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73  ROR).}.#endif..s
111f0 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
11200 74 73 6d 66 5f 73 74 61 72 74 5f 73 76 63 28 43  tsmf_start_svc(C
11210 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63  lientData cd, Tc
11220 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11230 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
11240 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
11250 5d 29 20 7b 0a 09 73 74 72 75 63 74 20 74 69 6d  ]) {..struct tim
11260 65 76 61 6c 20 73 65 6c 65 63 74 5f 74 69 6d 65  eval select_time
11270 6f 75 74 3b 0a 09 54 63 6c 5f 57 69 64 65 49 6e  out;..Tcl_WideIn
11280 74 20 75 6d 61 73 6b 5f 76 61 6c 2c 20 74 69 6d  t umask_val, tim
11290 65 6f 75 74 5f 76 61 6c 2c 20 75 69 64 5f 76 61  eout_val, uid_va
112a0 6c 2c 20 67 69 64 5f 76 61 6c 3b 0a 09 54 63 6c  l, gid_val;..Tcl
112b0 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61 6d 65 5f 6f  _Obj *filename_o
112c0 62 6a 2c 20 2a 65 6e 76 5f 6f 62 6a 2c 20 2a 6c  bj, *env_obj, *l
112d0 6f 67 66 69 6c 65 5f 6f 62 6a 2c 20 2a 2a 65 6e  ogfile_obj, **en
112e0 76 5f 65 6e 74 72 79 5f 6f 62 6a 76 2c 20 2a 63  v_entry_objv, *c
112f0 77 64 5f 6f 62 6a 2c 20 2a 75 6d 61 73 6b 5f 6f  wd_obj, *umask_o
11300 62 6a 2c 20 2a 75 69 64 5f 6f 62 6a 2c 20 2a 67  bj, *uid_obj, *g
11310 69 64 5f 6f 62 6a 3b 0a 09 54 63 6c 5f 4f 62 6a  id_obj;..Tcl_Obj
11320 20 2a 73 72 69 5f 6f 62 6a 2c 20 2a 74 69 6d 65   *sri_obj, *time
11330 6f 75 74 5f 6f 62 6a 3b 0a 09 70 69 64 5f 74 20  out_obj;..pid_t 
11340 63 68 69 6c 64 2c 20 63 68 69 6c 64 5f 70 67 69  child, child_pgi
11350 64 20 3d 20 2d 31 2c 20 77 61 69 74 70 69 64 5f  d = -1, waitpid_
11360 72 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65  ret;..ssize_t re
11370 61 64 5f 72 65 74 3b 0a 09 74 69 6d 65 5f 74 20  ad_ret;..time_t 
11380 63 75 72 72 74 69 6d 65 3b 0a 09 63 68 61 72 20  currtime;..char 
11390 2a 61 72 67 76 5b 33 5d 2c 20 2a 65 6e 76 76 5b  *argv[3], *envv[
113a0 35 31 32 5d 3b 0a 09 63 68 61 72 20 2a 6c 6f 67  512];..char *log
113b0 66 69 6c 65 2c 20 2a 66 69 6c 65 6e 61 6d 65 2c  file, *filename,
113c0 20 2a 63 77 64 3b 0a 09 63 68 61 72 20 6c 6f 67   *cwd;..char log
113d0 6d 73 67 5b 32 30 34 38 5d 3b 0a 09 66 64 5f 73  msg[2048];..fd_s
113e0 65 74 20 72 65 61 64 5f 66 64 73 65 74 3b 0a 09  et read_fdset;..
113f0 69 6e 74 20 70 69 70 65 5f 72 65 74 2c 20 73 65  int pipe_ret, se
11400 74 73 69 64 5f 72 65 74 2c 20 65 78 65 63 76 65  tsid_ret, execve
11410 5f 72 65 74 2c 20 74 63 6c 5f 72 65 74 2c 20 73  _ret, tcl_ret, s
11420 65 6c 65 63 74 5f 72 65 74 2c 20 63 68 64 69 72  elect_ret, chdir
11430 5f 72 65 74 3b 0a 09 69 6e 74 20 6e 75 6c 6c 5f  _ret;..int null_
11440 66 64 2c 20 6c 6f 67 5f 66 64 2c 20 74 6d 70 5f  fd, log_fd, tmp_
11450 66 64 2c 20 6d 61 78 5f 66 64 3b 0a 09 69 6e 74  fd, max_fd;..int
11460 20 65 6e 76 5f 65 6e 74 72 79 5f 6f 62 6a 63 3b   env_entry_objc;
11470 0a 09 69 6e 74 20 66 64 73 5b 32 5d 2c 20 66 64  ..int fds[2], fd
11480 3b 0a 09 69 6e 74 20 73 74 61 74 75 73 3b 0a 09  ;..int status;..
11490 69 6e 74 20 69 64 78 3b 0a 0a 09 2f 2a 20 31 2e  int idx;.../* 1.
114a0 20 50 61 72 73 65 20 61 72 67 75 6d 65 6e 74 73   Parse arguments
114b0 20 2a 2f 0a 09 2f 2a 20 31 2e 61 2e 20 45 6e 73   */../* 1.a. Ens
114c0 75 72 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ure the correct 
114d0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
114e0 6e 74 73 20 77 65 72 65 20 70 61 73 73 65 64 20  nts were passed 
114f0 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d 20  */..if (objc != 
11500 31 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f  10) {...Tcl_SetO
11510 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11520 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11530 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  j("wrong # args:
11540 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74   should be \"::t
11550 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 74  uapi::syscall::t
11560 73 6d 66 5f 73 74 61 72 74 5f 73 76 63 20 73 72  smf_start_svc sr
11570 69 20 66 69 6c 65 6e 61 6d 65 20 6c 6f 67 66 69  i filename logfi
11580 6c 65 20 65 6e 76 20 63 77 64 20 75 6d 61 73 6b  le env cwd umask
11590 20 75 69 64 20 67 69 64 20 74 69 6d 65 6f 75 74   uid gid timeout
115a0 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  \"", -1));....re
115b0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
115c0 0a 09 7d 0a 0a 09 2f 2a 20 31 2e 62 2e 20 49 64  ..}.../* 1.b. Id
115d0 65 6e 74 69 66 79 20 54 63 6c 5f 4f 62 6a 73 20  entify Tcl_Objs 
115e0 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
115f0 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 09 73 72 69  argument */..sri
11600 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a  _obj = objv[1];.
11610 09 66 69 6c 65 6e 61 6d 65 5f 6f 62 6a 20 3d 20  .filename_obj = 
11620 6f 62 6a 76 5b 32 5d 3b 0a 09 6c 6f 67 66 69 6c  objv[2];..logfil
11630 65 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 33 5d 3b  e_obj = objv[3];
11640 0a 09 65 6e 76 5f 6f 62 6a 20 3d 20 6f 62 6a 76  ..env_obj = objv
11650 5b 34 5d 3b 0a 09 63 77 64 5f 6f 62 6a 20 3d 20  [4];..cwd_obj = 
11660 6f 62 6a 76 5b 35 5d 3b 0a 09 75 6d 61 73 6b 5f  objv[5];..umask_
11670 6f 62 6a 20 3d 20 6f 62 6a 76 5b 36 5d 3b 0a 09  obj = objv[6];..
11680 75 69 64 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 37  uid_obj = objv[7
11690 5d 3b 0a 09 67 69 64 5f 6f 62 6a 20 3d 20 6f 62  ];..gid_obj = ob
116a0 6a 76 5b 38 5d 3b 0a 09 74 69 6d 65 6f 75 74 5f  jv[8];..timeout_
116b0 6f 62 6a 20 3d 20 6f 62 6a 76 5b 39 5d 3b 0a 0a  obj = objv[9];..
116c0 09 2f 2a 20 31 2e 63 2e 20 53 74 6f 72 65 20 73  ./* 1.c. Store s
116d0 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  tring arguments 
116e0 2a 2f 0a 09 66 69 6c 65 6e 61 6d 65 20 3d 20 54  */..filename = T
116f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 66 69 6c  cl_GetString(fil
11700 65 6e 61 6d 65 5f 6f 62 6a 29 3b 0a 09 6c 6f 67  ename_obj);..log
11710 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
11720 72 69 6e 67 28 6c 6f 67 66 69 6c 65 5f 6f 62 6a  ring(logfile_obj
11730 29 3b 0a 09 63 77 64 20 3d 20 54 63 6c 5f 47 65  );..cwd = Tcl_Ge
11740 74 53 74 72 69 6e 67 28 63 77 64 5f 6f 62 6a 29  tString(cwd_obj)
11750 3b 0a 0a 09 2f 2a 20 31 2e 64 2e 20 49 6e 74 65  ;.../* 1.d. Inte
11760 67 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09  ger objects */..
11770 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65  tcl_ret = Tcl_Ge
11780 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
11790 69 6e 74 65 72 70 2c 20 75 6d 61 73 6b 5f 6f 62  interp, umask_ob
117a0 6a 2c 20 26 75 6d 61 73 6b 5f 76 61 6c 29 3b 0a  j, &umask_val);.
117b0 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20  .if (tcl_ret != 
117c0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
117d0 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09 7d 0a  rn(tcl_ret);..}.
117e0 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f  ..tcl_ret = Tcl_
117f0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
11800 6a 28 69 6e 74 65 72 70 2c 20 74 69 6d 65 6f 75  j(interp, timeou
11810 74 5f 6f 62 6a 2c 20 26 74 69 6d 65 6f 75 74 5f  t_obj, &timeout_
11820 76 61 6c 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72  val);..if (tcl_r
11830 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  et != TCL_OK) {.
11840 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74  ..return(tcl_ret
11850 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20  );..}...tcl_ret 
11860 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  = Tcl_GetWideInt
11870 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
11880 75 69 64 5f 6f 62 6a 2c 20 26 75 69 64 5f 76 61  uid_obj, &uid_va
11890 6c 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74  l);..if (tcl_ret
118a0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
118b0 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b  return(tcl_ret);
118c0 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20  ..}...tcl_ret = 
118d0 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
118e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 67 69  omObj(interp, gi
118f0 64 5f 6f 62 6a 2c 20 26 67 69 64 5f 76 61 6c 29  d_obj, &gid_val)
11900 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21  ;..if (tcl_ret !
11910 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
11920 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09  turn(tcl_ret);..
11930 7d 0a 0a 09 2f 2a 20 31 2e 65 2e 20 50 72 6f 63  }.../* 1.e. Proc
11940 65 73 73 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ess environment 
11950 2a 2f 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63  */..tcl_ret = Tc
11960 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
11970 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 65 6e 76  ents(interp, env
11980 5f 6f 62 6a 2c 20 26 65 6e 76 5f 65 6e 74 72 79  _obj, &env_entry
11990 5f 6f 62 6a 63 2c 20 26 65 6e 76 5f 65 6e 74 72  _objc, &env_entr
119a0 79 5f 6f 62 6a 76 29 3b 0a 09 69 66 20 28 74 63  y_objv);..if (tc
119b0 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  l_ret != TCL_OK)
119c0 20 7b 0a 09 09 72 65 74 75 72 6e 28 74 63 6c 5f   {...return(tcl_
119d0 72 65 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  ret);..}...for (
119e0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 4d  idx = 0; idx < M
119f0 49 4e 28 65 6e 76 5f 65 6e 74 72 79 5f 6f 62 6a  IN(env_entry_obj
11a00 63 2c 20 73 69 7a 65 6f 66 28 65 6e 76 76 29 20  c, sizeof(envv) 
11a10 2f 20 73 69 7a 65 6f 66 28 65 6e 76 76 5b 30 5d  / sizeof(envv[0]
11a20 29 20 2d 20 31 29 3b 20 69 64 78 2b 2b 29 20 7b  ) - 1); idx++) {
11a30 0a 09 09 65 6e 76 76 5b 69 64 78 5d 20 3d 20 54  ...envv[idx] = T
11a40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 65 6e 76  cl_GetString(env
11a50 5f 65 6e 74 72 79 5f 6f 62 6a 76 5b 69 64 78 5d  _entry_objv[idx]
11a60 29 3b 0a 09 7d 0a 09 65 6e 76 76 5b 69 64 78 5d  );..}..envv[idx]
11a70 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2a 20 32 2e   = NULL;.../* 2.
11a80 20 43 72 65 61 74 65 20 61 20 70 69 70 65 20 66   Create a pipe f
11a90 6f 72 20 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e  or communication
11aa0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 72 6f   between the pro
11ab0 63 65 73 73 65 73 20 2a 2f 0a 09 70 69 70 65 5f  cesses */..pipe_
11ac0 72 65 74 20 3d 20 70 69 70 65 28 66 64 73 29 3b  ret = pipe(fds);
11ad0 0a 09 69 66 20 28 70 69 70 65 5f 72 65 74 20 21  ..if (pipe_ret !
11ae0 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  = 0) {...Tcl_Set
11af0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11b00 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11b10 62 6a 28 22 70 69 70 65 20 66 61 69 6c 65 64 22  bj("pipe failed"
11b20 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72  , -1));....retur
11b30 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
11b40 0a 0a 09 2f 2a 20 33 2e 20 46 6f 72 6b 20 69 6e  .../* 3. Fork in
11b50 74 6f 20 61 20 6e 65 77 20 70 72 6f 63 65 73 73  to a new process
11b60 20 2a 2f 0a 09 63 68 69 6c 64 20 3d 20 66 6f 72   */..child = for
11b70 6b 28 29 3b 0a 09 69 66 20 28 63 68 69 6c 64 20  k();..if (child 
11b80 3d 3d 20 2d 31 29 20 7b 0a 09 09 54 63 6c 5f 53  == -1) {...Tcl_S
11b90 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11ba0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
11bb0 67 4f 62 6a 28 22 66 6f 72 6b 20 66 61 69 6c 65  gObj("fork faile
11bc0 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74  d", -1));....ret
11bd0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
11be0 09 7d 0a 0a 09 69 66 20 28 63 68 69 6c 64 20 21  .}...if (child !
11bf0 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 34 2e 70 61  = 0) {.../* 4.pa
11c00 72 65 6e 74 2e 20 47 65 74 20 50 47 49 44 20 66  rent. Get PGID f
11c10 72 6f 6d 20 63 68 69 6c 64 20 2a 2f 0a 09 09 2f  rom child */.../
11c20 2a 20 34 2e 70 61 72 65 6e 74 2e 61 2e 20 4f 70  * 4.parent.a. Op
11c30 65 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09  en log file */..
11c40 09 6c 6f 67 5f 66 64 20 3d 20 6f 70 65 6e 28 6c  .log_fd = open(l
11c50 6f 67 66 69 6c 65 2c 20 4f 5f 57 52 4f 4e 4c 59  ogfile, O_WRONLY
11c60 20 7c 20 4f 5f 43 52 45 41 54 20 7c 20 4f 5f 41   | O_CREAT | O_A
11c70 50 50 45 4e 44 2c 20 53 5f 49 52 55 53 52 20 7c  PPEND, S_IRUSR |
11c80 20 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47   S_IWUSR | S_IRG
11c90 52 50 20 7c 20 53 5f 49 52 4f 54 48 29 3b 0a 0a  RP | S_IROTH);..
11ca0 09 09 2f 2a 20 34 2e 70 61 72 65 6e 74 2e 62 2e  ../* 4.parent.b.
11cb0 20 43 6c 6f 73 65 20 77 72 69 74 65 20 65 6e 64   Close write end
11cc0 20 6f 66 20 70 69 70 65 20 2d 2d 20 77 65 20 61   of pipe -- we a
11cd0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  re read-only */.
11ce0 09 09 63 6c 6f 73 65 28 66 64 73 5b 31 5d 29 3b  ..close(fds[1]);
11cf0 0a 09 09 66 64 20 3d 20 66 64 73 5b 30 5d 3b 0a  ...fd = fds[0];.
11d00 0a 09 09 2f 2a 20 34 2e 70 61 72 65 6e 74 2e 63  .../* 4.parent.c
11d10 2e 20 52 65 61 64 20 70 72 6f 63 65 73 73 20 67  . Read process g
11d20 72 6f 75 70 20 49 44 20 6f 66 20 63 68 69 6c 64  roup ID of child
11d30 20 66 72 6f 6d 20 70 69 70 65 20 2a 2f 0a 09 09   from pipe */...
11d40 73 65 6c 65 63 74 5f 74 69 6d 65 6f 75 74 2e 74  select_timeout.t
11d50 76 5f 73 65 63 20 3d 20 74 69 6d 65 6f 75 74 5f  v_sec = timeout_
11d60 76 61 6c 3b 0a 09 09 73 65 6c 65 63 74 5f 74 69  val;...select_ti
11d70 6d 65 6f 75 74 2e 74 76 5f 75 73 65 63 20 3d 20  meout.tv_usec = 
11d80 30 3b 0a 0a 09 09 46 44 5f 5a 45 52 4f 28 26 72  0;....FD_ZERO(&r
11d90 65 61 64 5f 66 64 73 65 74 29 3b 0a 09 09 46 44  ead_fdset);...FD
11da0 5f 53 45 54 28 66 64 2c 20 26 72 65 61 64 5f 66  _SET(fd, &read_f
11db0 64 73 65 74 29 3b 0a 0a 09 09 73 65 6c 65 63 74  dset);....select
11dc0 5f 72 65 74 20 3d 20 73 65 6c 65 63 74 28 66 64  _ret = select(fd
11dd0 20 2b 20 31 2c 20 26 72 65 61 64 5f 66 64 73 65   + 1, &read_fdse
11de0 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  t, NULL, NULL, &
11df0 73 65 6c 65 63 74 5f 74 69 6d 65 6f 75 74 29 3b  select_timeout);
11e00 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
11e10 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 2f 2a 20  t == 0) {..../* 
11e20 4f 6e 20 74 69 6d 65 6f 75 74 2c 20 74 65 72 6d  On timeout, term
11e30 69 6e 61 74 65 20 73 74 61 72 74 69 6e 67 20 70  inate starting p
11e40 72 6f 63 65 73 73 20 2a 2f 0a 09 09 09 63 68 69  rocess */....chi
11e50 6c 64 5f 70 67 69 64 20 3d 20 67 65 74 70 67 69  ld_pgid = getpgi
11e60 64 28 63 68 69 6c 64 29 3b 0a 09 09 09 69 66 20  d(child);....if 
11e70 28 63 68 69 6c 64 5f 70 67 69 64 20 21 3d 20 2d  (child_pgid != -
11e80 31 29 20 7b 0a 09 09 09 09 6b 69 6c 6c 28 2d 63  1) {.....kill(-c
11e90 68 69 6c 64 5f 70 67 69 64 2c 20 53 49 47 4b 49  hild_pgid, SIGKI
11ea0 4c 4c 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 54 63  LL);....}.....Tc
11eb0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11ec0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
11ed0 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74  ringObj("timeout
11ee0 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 63 75 72  ", -1));.....cur
11ef0 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  rtime = time(NUL
11f00 4c 29 3b 0a 09 09 09 73 74 72 66 74 69 6d 65 28  L);....strftime(
11f10 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c  logmsg, sizeof(l
11f20 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25 65  ogmsg), "[ %b %e
11f30 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f 63   %H:%M:%S ", loc
11f40 61 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d 65  altime(&currtime
11f50 29 29 3b 0a 09 09 09 77 72 69 74 65 28 6c 6f 67  ));....write(log
11f60 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72  _fd, logmsg, str
11f70 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09  len(logmsg));...
11f80 09 09 73 6e 70 72 69 6e 74 66 28 6c 6f 67 6d 73  ..snprintf(logms
11f90 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 6d 73 67  g, sizeof(logmsg
11fa0 29 2c 20 22 4d 65 74 68 6f 64 20 5c 22 73 74 61  ), "Method \"sta
11fb0 72 74 5c 22 20 74 69 6d 65 64 20 6f 75 74 20 61  rt\" timed out a
11fc0 66 74 65 72 20 25 69 20 73 65 63 6f 6e 64 73 20  fter %i seconds 
11fd0 5d 5c 6e 22 2c 20 28 69 6e 74 29 20 74 69 6d 65  ]\n", (int) time
11fe0 6f 75 74 5f 76 61 6c 29 3b 0a 09 09 09 77 72 69  out_val);....wri
11ff0 74 65 28 6c 6f 67 5f 66 64 2c 20 6c 6f 67 6d 73  te(log_fd, logms
12000 67 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67  g, strlen(logmsg
12010 29 29 3b 0a 0a 09 09 09 63 6c 6f 73 65 28 6c 6f  ));.....close(lo
12020 67 5f 66 64 29 3b 0a 0a 09 09 09 72 65 74 75 72  g_fd);.....retur
12030 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  n(TCL_ERROR);...
12040 7d 0a 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f  }....if (select_
12050 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 72 65  ret > 0) {....re
12060 61 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66 64  ad_ret = read(fd
12070 2c 20 26 63 68 69 6c 64 5f 70 67 69 64 2c 20 73  , &child_pgid, s
12080 69 7a 65 6f 66 28 63 68 69 6c 64 5f 70 67 69 64  izeof(child_pgid
12090 29 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 34 2e  ));...}..../* 4.
120a0 70 61 72 65 6e 74 2e 64 2e 20 43 6c 6f 73 65 20  parent.d. Close 
120b0 72 65 61 64 20 65 6e 64 20 6f 66 20 70 69 70 65  read end of pipe
120c0 20 2a 2f 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b   */...close(fd);
120d0 0a 0a 09 09 2f 2a 20 34 2e 70 61 72 65 6e 74 2e  ..../* 4.parent.
120e0 65 2e 20 56 65 72 69 66 79 20 72 65 61 64 20 77  e. Verify read w
120f0 61 73 20 6d 65 61 6e 69 6e 67 66 75 6c 20 2a 2f  as meaningful */
12100 0a 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ...if (read_ret 
12110 21 3d 20 73 69 7a 65 6f 66 28 63 68 69 6c 64 5f  != sizeof(child_
12120 70 67 69 64 29 29 20 7b 0a 09 09 09 54 63 6c 5f  pgid)) {....Tcl_
12130 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12140 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
12150 6e 67 4f 62 6a 28 22 66 61 69 6c 65 64 20 74 6f  ngObj("failed to
12160 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74   communicate wit
12170 68 20 73 74 61 72 74 65 64 20 73 65 72 76 69 63  h started servic
12180 65 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 63 75  e", -1));.....cu
12190 72 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  rrtime = time(NU
121a0 4c 4c 29 3b 0a 09 09 09 73 74 72 66 74 69 6d 65  LL);....strftime
121b0 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28  (logmsg, sizeof(
121c0 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25  logmsg), "[ %b %
121d0 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f  e %H:%M:%S ", lo
121e0 63 61 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d  caltime(&currtim
121f0 65 29 29 3b 0a 09 09 09 77 72 69 74 65 28 6c 6f  e));....write(lo
12200 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20 73 74  g_fd, logmsg, st
12210 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a  rlen(logmsg));..
12220 09 09 09 73 6e 70 72 69 6e 74 66 28 6c 6f 67 6d  ...snprintf(logm
12230 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 6d 73  sg, sizeof(logms
12240 67 29 2c 20 22 4d 65 74 68 6f 64 20 5c 22 73 74  g), "Method \"st
12250 61 72 74 5c 22 20 66 61 69 6c 65 64 3a 20 63 6f  art\" failed: co
12260 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 77 69 74 68  mmunication with
12270 20 73 74 61 72 74 65 64 20 73 65 72 76 69 63 65   started service
12280 20 62 72 6f 6b 65 6e 20 5d 5c 6e 22 29 3b 0a 09   broken ]\n");..
12290 09 09 77 72 69 74 65 28 6c 6f 67 5f 66 64 2c 20  ..write(log_fd, 
122a0 6c 6f 67 6d 73 67 2c 20 73 74 72 6c 65 6e 28 6c  logmsg, strlen(l
122b0 6f 67 6d 73 67 29 29 3b 0a 0a 09 09 09 63 6c 6f  ogmsg));.....clo
122c0 73 65 28 6c 6f 67 5f 66 64 29 3b 0a 0a 09 09 09  se(log_fd);.....
122d0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
122e0 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 34 2e 70  );...}..../* 4.p
122f0 61 72 65 6e 74 2e 66 2e 20 49 66 20 74 68 65 20  arent.f. If the 
12300 50 47 49 44 20 67 69 76 65 6e 20 69 73 20 61 63  PGID given is ac
12310 74 75 61 6c 6c 79 20 61 6e 20 65 72 72 6f 72 2c  tually an error,
12320 20 72 65 74 75 72 6e 20 65 72 72 6f 72 20 2a 2f   return error */
12330 0a 09 09 69 66 20 28 63 68 69 6c 64 5f 70 67 69  ...if (child_pgi
12340 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 54 63  d == -1) {....Tc
12350 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12360 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
12370 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 69 63 65  ringObj("service
12380 20 66 61 69 6c 65 64 20 74 6f 20 73 74 61 72 74   failed to start
12390 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 63 75 72  ", -1));.....cur
123a0 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  rtime = time(NUL
123b0 4c 29 3b 0a 09 09 09 73 74 72 66 74 69 6d 65 28  L);....strftime(
123c0 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c  logmsg, sizeof(l
123d0 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25 65  ogmsg), "[ %b %e
123e0 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f 63   %H:%M:%S ", loc
123f0 61 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d 65  altime(&currtime
12400 29 29 3b 0a 09 09 09 77 72 69 74 65 28 6c 6f 67  ));....write(log
12410 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72  _fd, logmsg, str
12420 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09  len(logmsg));...
12430 09 09 73 6e 70 72 69 6e 74 66 28 6c 6f 67 6d 73  ..snprintf(logms
12440 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 6d 73 67  g, sizeof(logmsg
12450 29 2c 20 22 4d 65 74 68 6f 64 20 5c 22 73 74 61  ), "Method \"sta
12460 72 74 5c 22 20 66 61 69 6c 65 64 20 5d 5c 6e 22  rt\" failed ]\n"
12470 29 3b 0a 09 09 09 77 72 69 74 65 28 6c 6f 67 5f  );....write(log_
12480 66 64 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72 6c  fd, logmsg, strl
12490 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09 09  en(logmsg));....
124a0 09 63 6c 6f 73 65 28 6c 6f 67 5f 66 64 29 3b 0a  .close(log_fd);.
124b0 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
124c0 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  RROR);...}..../*
124d0 20 34 2e 70 61 72 65 6e 74 2e 67 2e 20 52 65 74   4.parent.g. Ret
124e0 75 72 6e 20 50 47 49 44 20 74 6f 20 54 63 6c 20  urn PGID to Tcl 
124f0 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52  */...Tcl_SetObjR
12500 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
12510 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
12520 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 63 68  (Tcl_WideInt) ch
12530 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09 09 63  ild_pgid));....c
12540 75 72 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e  urrtime = time(N
12550 55 4c 4c 29 3b 0a 09 09 73 74 72 66 74 69 6d 65  ULL);...strftime
12560 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28  (logmsg, sizeof(
12570 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25  logmsg), "[ %b %
12580 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f  e %H:%M:%S ", lo
12590 63 61 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d  caltime(&currtim
125a0 65 29 29 3b 0a 09 09 77 72 69 74 65 28 6c 6f 67  e));...write(log
125b0 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72  _fd, logmsg, str
125c0 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09  len(logmsg));...
125d0 09 73 6e 70 72 69 6e 74 66 28 6c 6f 67 6d 73 67  .snprintf(logmsg
125e0 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 6d 73 67 29  , sizeof(logmsg)
125f0 2c 20 22 4d 65 74 68 6f 64 20 5c 22 73 74 61 72  , "Method \"star
12600 74 5c 22 20 63 6f 6d 70 6c 65 74 65 64 2c 20 70  t\" completed, p
12610 72 6f 63 65 73 73 20 67 72 6f 75 70 20 3d 20 25  rocess group = %
12620 6c 75 20 5d 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  lu ]\n", (unsign
12630 65 64 20 6c 6f 6e 67 29 20 63 68 69 6c 64 5f 70  ed long) child_p
12640 67 69 64 29 3b 0a 09 09 77 72 69 74 65 28 6c 6f  gid);...write(lo
12650 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20 73 74  g_fd, logmsg, st
12660 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a  rlen(logmsg));..
12670 09 09 63 6c 6f 73 65 28 6c 6f 67 5f 66 64 29 3b  ..close(log_fd);
12680 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f  ....return(TCL_O
12690 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 34 2e 63 68  K);..}.../* 4.ch
126a0 69 6c 64 2e 61 2e 20 43 6c 6f 73 65 20 72 65 61  ild.a. Close rea
126b0 64 20 65 6e 64 20 6f 66 20 70 69 70 65 20 2d 2d  d end of pipe --
126c0 20 77 65 20 6f 6e 6c 79 20 77 72 69 74 65 20 74   we only write t
126d0 6f 20 69 74 20 2a 2f 0a 09 63 6c 6f 73 65 28 66  o it */..close(f
126e0 64 73 5b 30 5d 29 3b 0a 09 66 64 20 3d 20 66 64  ds[0]);..fd = fd
126f0 73 5b 31 5d 3b 0a 0a 09 2f 2a 20 35 2e 20 43 72  s[1];.../* 5. Cr
12700 65 61 74 65 20 61 20 6e 65 77 20 73 65 73 73 69  eate a new sessi
12710 6f 6e 20 2a 2f 0a 09 73 65 74 73 69 64 5f 72 65  on */..setsid_re
12720 74 20 3d 20 73 65 74 73 69 64 28 29 3b 0a 09 69  t = setsid();..i
12730 66 20 28 73 65 74 73 69 64 5f 72 65 74 20 3d 3d  f (setsid_ret ==
12740 20 2d 31 29 20 7b 0a 09 09 77 72 69 74 65 28 66   -1) {...write(f
12750 64 2c 20 26 63 68 69 6c 64 5f 70 67 69 64 2c 20  d, &child_pgid, 
12760 73 69 7a 65 6f 66 28 63 68 69 6c 64 5f 70 67 69  sizeof(child_pgi
12770 64 29 29 3b 0a 0a 09 09 5f 65 78 69 74 28 30 29  d));...._exit(0)
12780 3b 0a 09 7d 0a 0a 09 2f 2a 20 36 2e 20 53 65 74  ;..}.../* 6. Set
12790 75 70 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 2a  up environment *
127a0 2f 0a 09 2f 2a 20 36 2e 61 2e 20 53 65 74 20 75  /../* 6.a. Set u
127b0 6d 61 73 6b 20 2a 2f 0a 09 75 6d 61 73 6b 28 75  mask */..umask(u
127c0 6d 61 73 6b 5f 76 61 6c 29 3b 0a 0a 09 2f 2a 20  mask_val);.../* 
127d0 36 2e 62 2e 20 53 65 74 20 77 6f 72 6b 69 6e 67  6.b. Set working
127e0 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 09 63   directory */..c
127f0 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72  hdir_ret = chdir
12800 28 63 77 64 29 3b 0a 09 69 66 20 28 63 68 64 69  (cwd);..if (chdi
12810 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  r_ret != 0) {...
12820 77 72 69 74 65 28 66 64 2c 20 26 63 68 69 6c 64  write(fd, &child
12830 5f 70 67 69 64 2c 20 73 69 7a 65 6f 66 28 63 68  _pgid, sizeof(ch
12840 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09 09 5f  ild_pgid));...._
12850 65 78 69 74 28 30 29 3b 0a 09 7d 0a 0a 09 2f 2a  exit(0);..}.../*
12860 20 36 2e 63 2e 20 4f 70 65 6e 20 6c 6f 67 20 66   6.c. Open log f
12870 69 6c 65 20 66 6f 72 20 73 74 64 65 72 72 20 61  ile for stderr a
12880 6e 64 20 73 74 64 6f 75 74 20 2a 2f 0a 09 6c 6f  nd stdout */..lo
12890 67 5f 66 64 20 3d 20 6f 70 65 6e 28 6c 6f 67 66  g_fd = open(logf
128a0 69 6c 65 2c 20 4f 5f 57 52 4f 4e 4c 59 20 7c 20  ile, O_WRONLY | 
128b0 4f 5f 43 52 45 41 54 20 7c 20 4f 5f 41 50 50 45  O_CREAT | O_APPE
128c0 4e 44 2c 20 53 5f 49 52 55 53 52 20 7c 20 53 5f  ND, S_IRUSR | S_
128d0 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 20  IWUSR | S_IRGRP 
128e0 7c 20 53 5f 49 52 4f 54 48 29 3b 0a 0a 09 2f 2a  | S_IROTH);.../*
128f0 20 36 2e 64 2e 20 4f 70 65 6e 20 22 2f 64 65 76   6.d. Open "/dev
12900 2f 6e 75 6c 6c 22 20 66 6f 72 20 73 74 64 69 6e  /null" for stdin
12910 20 2a 2f 0a 09 6e 75 6c 6c 5f 66 64 20 3d 20 6f   */..null_fd = o
12920 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
12930 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 69 66 20   O_RDONLY);..if 
12940 28 6e 75 6c 6c 5f 66 64 20 3c 20 30 20 7c 7c 20  (null_fd < 0 || 
12950 6c 6f 67 5f 66 64 20 3c 30 29 20 7b 0a 09 09 77  log_fd <0) {...w
12960 72 69 74 65 28 66 64 2c 20 26 63 68 69 6c 64 5f  rite(fd, &child_
12970 70 67 69 64 2c 20 73 69 7a 65 6f 66 28 63 68 69  pgid, sizeof(chi
12980 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09 09 5f 65  ld_pgid));...._e
12990 78 69 74 28 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  xit(0);..}.../* 
129a0 36 2e 65 2e 20 52 65 64 69 72 65 63 74 20 73 74  6.e. Redirect st
129b0 64 69 6e 2c 20 73 74 64 6f 75 74 2c 20 61 6e 64  din, stdout, and
129c0 20 73 74 64 65 72 72 20 74 6f 20 6e 75 6c 6c 2c   stderr to null,
129d0 20 6c 6f 67 73 20 2a 2f 0a 09 64 75 70 32 28 6e   logs */..dup2(n
129e0 75 6c 6c 5f 66 64 2c 20 53 54 44 49 4e 5f 46 49  ull_fd, STDIN_FI
129f0 4c 45 4e 4f 29 3b 0a 09 64 75 70 32 28 6c 6f 67  LENO);..dup2(log
12a00 5f 66 64 2c 20 53 54 44 4f 55 54 5f 46 49 4c 45  _fd, STDOUT_FILE
12a10 4e 4f 29 3b 0a 09 64 75 70 32 28 6c 6f 67 5f 66  NO);..dup2(log_f
12a20 64 2c 20 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f  d, STDERR_FILENO
12a30 29 3b 0a 0a 09 63 6c 6f 73 65 28 6e 75 6c 6c 5f  );...close(null_
12a40 66 64 29 3b 0a 09 63 6c 6f 73 65 28 6c 6f 67 5f  fd);..close(log_
12a50 66 64 29 3b 0a 0a 09 2f 2a 20 36 2e 66 2e 20 43  fd);.../* 6.f. C
12a60 6c 6f 73 65 20 73 74 72 61 79 20 66 69 6c 65 20  lose stray file 
12a70 64 65 73 63 72 69 70 74 6f 72 73 20 2a 2f 0a 09  descriptors */..
12a80 6d 61 78 5f 66 64 20 3d 20 4d 41 58 28 4d 41 58  max_fd = MAX(MAX
12a90 28 4d 41 58 28 31 30 32 34 2c 20 53 54 44 49 4e  (MAX(1024, STDIN
12aa0 5f 46 49 4c 45 4e 4f 29 2c 20 53 54 44 4f 55 54  _FILENO), STDOUT
12ab0 5f 46 49 4c 45 4e 4f 29 2c 20 53 54 44 45 52 52  _FILENO), STDERR
12ac0 5f 46 49 4c 45 4e 4f 29 3b 0a 09 66 6f 72 20 28  _FILENO);..for (
12ad0 74 6d 70 5f 66 64 20 3d 20 30 3b 20 74 6d 70 5f  tmp_fd = 0; tmp_
12ae0 66 64 20 3c 20 6d 61 78 5f 66 64 3b 20 74 6d 70  fd < max_fd; tmp
12af0 5f 66 64 2b 2b 29 20 7b 0a 09 09 69 66 20 28 74  _fd++) {...if (t
12b00 6d 70 5f 66 64 20 3d 3d 20 53 54 44 49 4e 5f 46  mp_fd == STDIN_F
12b10 49 4c 45 4e 4f 20 7c 7c 20 74 6d 70 5f 66 64 20  ILENO || tmp_fd 
12b20 3d 3d 20 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f  == STDOUT_FILENO
12b30 20 7c 7c 20 74 6d 70 5f 66 64 20 3d 3d 20 53 54   || tmp_fd == ST
12b40 44 45 52 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09  DERR_FILENO) {..
12b50 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
12b60 0a 09 09 69 66 20 28 74 6d 70 5f 66 64 20 3d 3d  ...if (tmp_fd ==
12b70 20 66 64 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e   fd) {....contin
12b80 75 65 3b 0a 09 09 7d 0a 0a 09 09 63 6c 6f 73 65  ue;...}....close
12b90 28 74 6d 70 5f 66 64 29 3b 0a 09 7d 0a 0a 09 2f  (tmp_fd);..}.../
12ba0 2a 20 36 2e 67 2e 20 53 77 69 74 63 68 20 74 6f  * 6.g. Switch to
12bb0 20 61 70 70 72 6f 70 72 69 61 74 65 20 75 73 65   appropriate use
12bc0 72 2f 67 72 6f 75 70 20 2a 2f 0a 09 2f 2a 20 36  r/group */../* 6
12bd0 2e 67 2e 69 2e 20 47 72 6f 75 70 20 2a 2f 0a 09  .g.i. Group */..
12be0 73 65 74 67 69 64 28 67 69 64 5f 76 61 6c 29 3b  setgid(gid_val);
12bf0 0a 0a 09 2f 2a 20 36 2e 67 2e 69 69 2e 20 55 73  .../* 6.g.ii. Us
12c00 65 72 20 2a 2f 0a 09 73 65 74 75 69 64 28 75 69  er */..setuid(ui
12c10 64 5f 76 61 6c 29 3b 0a 0a 09 2f 2a 20 37 2e 20  d_val);.../* 7. 
12c20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 72 6f  Create a new pro
12c30 63 65 73 73 20 74 6f 20 61 63 74 75 61 6c 6c 79  cess to actually
12c40 20 73 70 61 77 6e 20 74 68 65 20 70 72 6f 63 65   spawn the proce
12c50 73 73 20 2a 2f 0a 09 63 68 69 6c 64 20 3d 20 66  ss */..child = f
12c60 6f 72 6b 28 29 3b 0a 09 69 66 20 28 63 68 69 6c  ork();..if (chil
12c70 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 77 72 69  d == -1) {...wri
12c80 74 65 28 66 64 2c 20 26 63 68 69 6c 64 5f 70 67  te(fd, &child_pg
12c90 69 64 2c 20 73 69 7a 65 6f 66 28 63 68 69 6c 64  id, sizeof(child
12ca0 5f 70 67 69 64 29 29 3b 0a 0a 09 09 5f 65 78 69  _pgid));...._exi
12cb0 74 28 30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  t(0);..}...if (c
12cc0 68 69 6c 64 20 21 3d 20 30 29 20 7b 0a 09 09 2f  hild != 0) {.../
12cd0 2a 20 37 2e 70 61 72 65 6e 74 2e 61 2e 20 57 61  * 7.parent.a. Wa
12ce0 69 74 20 66 6f 72 20 63 68 69 6c 64 20 70 72 6f  it for child pro
12cf0 63 65 73 73 20 74 6f 20 74 65 72 6d 69 6e 61 74  cess to terminat
12d00 65 20 61 6e 64 20 63 6f 6c 6c 65 63 74 20 73 74  e and collect st
12d10 61 74 75 73 20 2a 2f 0a 09 09 77 61 69 74 70 69  atus */...waitpi
12d20 64 5f 72 65 74 20 3d 20 77 61 69 74 70 69 64 28  d_ret = waitpid(
12d30 63 68 69 6c 64 2c 20 26 73 74 61 74 75 73 2c 20  child, &status, 
12d40 30 29 3b 0a 09 09 69 66 20 28 77 61 69 74 70 69  0);...if (waitpi
12d50 64 5f 72 65 74 20 3d 3d 20 2d 31 29 20 7b 0a 09  d_ret == -1) {..
12d60 09 09 73 74 61 74 75 73 20 3d 20 2d 31 3b 0a 09  ..status = -1;..
12d70 09 7d 0a 0a 09 09 2f 2a 20 37 2e 70 61 72 65 6e  .}..../* 7.paren
12d80 74 2e 62 2e 20 53 65 74 20 50 47 49 44 20 28 69  t.b. Set PGID (i
12d90 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2d 31  f successful, -1
12da0 20 6f 74 68 65 72 77 69 73 65 29 20 74 6f 20 70   otherwise) to p
12db0 61 73 73 20 62 61 63 6b 20 74 6f 20 54 53 4d 46  ass back to TSMF
12dc0 20 2a 2f 0a 09 09 69 66 20 28 73 74 61 74 75 73   */...if (status
12dd0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 63 68 69 6c   == 0) {....chil
12de0 64 5f 70 67 69 64 20 3d 20 67 65 74 70 67 69 64  d_pgid = getpgid
12df0 28 67 65 74 70 69 64 28 29 29 3b 0a 09 09 7d 0a  (getpid());...}.
12e00 09 09 77 72 69 74 65 28 66 64 2c 20 26 63 68 69  ..write(fd, &chi
12e10 6c 64 5f 70 67 69 64 2c 20 73 69 7a 65 6f 66 28  ld_pgid, sizeof(
12e20 63 68 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09  child_pgid));...
12e30 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 2f  .close(fd);..../
12e40 2a 20 37 2e 70 61 72 65 6e 74 2e 63 2e 20 57 72  * 7.parent.c. Wr
12e50 69 74 65 20 6c 6f 67 20 6f 66 20 72 65 73 75 6c  ite log of resul
12e60 74 20 2a 2f 0a 09 09 2f 2a 20 4e 6f 74 65 3a 20  t */.../* Note: 
12e70 57 65 20 61 76 6f 69 64 20 41 4e 53 49 20 49 2f  We avoid ANSI I/
12e80 4f 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  O here in case t
12e90 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12ea0 73 6f 6d 65 74 68 69 6e 67 20 69 6e 20 74 68 65  something in the
12eb0 20 62 75 66 66 65 72 20 2a 2f 0a 09 09 63 75 72   buffer */...cur
12ec0 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  rtime = time(NUL
12ed0 4c 29 3b 0a 09 09 73 74 72 66 74 69 6d 65 28 6c  L);...strftime(l
12ee0 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f  ogmsg, sizeof(lo
12ef0 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25 65 20  gmsg), "[ %b %e 
12f00 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f 63 61  %H:%M:%S ", loca
12f10 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d 65 29  ltime(&currtime)
12f20 29 3b 0a 09 09 77 72 69 74 65 28 53 54 44 45 52  );...write(STDER
12f30 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f 67 6d 73 67  R_FILENO, logmsg
12f40 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29  , strlen(logmsg)
12f50 29 3b 0a 0a 09 09 73 6e 70 72 69 6e 74 66 28 6c  );....snprintf(l
12f60 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f  ogmsg, sizeof(lo
12f70 67 6d 73 67 29 2c 20 22 4d 65 74 68 6f 64 20 5c  gmsg), "Method \
12f80 22 73 74 61 72 74 5c 22 20 65 78 69 74 65 64 20  "start\" exited 
12f90 77 69 74 68 20 73 74 61 74 75 73 20 25 69 20 5d  with status %i ]
12fa0 5c 6e 22 2c 20 57 45 58 49 54 53 54 41 54 55 53  \n", WEXITSTATUS
12fb0 28 73 74 61 74 75 73 29 29 3b 0a 09 09 77 72 69  (status));...wri
12fc0 74 65 28 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f  te(STDERR_FILENO
12fd0 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72 6c 65 6e  , logmsg, strlen
12fe0 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09 09 5f 65  (logmsg));...._e
12ff0 78 69 74 28 30 29 3b 0a 09 7d 0a 09 0a 09 2f 2a  xit(0);..}..../*
13000 20 37 2e 63 68 69 6c 64 2e 61 2e 20 43 6c 6f 73   7.child.a. Clos
13010 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 70 61 72  e channel to par
13020 65 6e 74 20 2a 2f 0a 09 63 6c 6f 73 65 28 66 64  ent */..close(fd
13030 29 3b 0a 0a 09 2f 2a 20 38 2e 20 4c 6f 67 20 61  );.../* 8. Log a
13040 74 74 65 6d 70 74 20 74 6f 20 72 75 6e 20 73 74  ttempt to run st
13050 61 72 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 09 63  art method */..c
13060 75 72 72 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e  urrtime = time(N
13070 55 4c 4c 29 3b 0a 09 73 74 72 66 74 69 6d 65 28  ULL);..strftime(
13080 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c  logmsg, sizeof(l
13090 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62 20 25 65  ogmsg), "[ %b %e
130a0 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c 6f 63   %H:%M:%S ", loc
130b0 61 6c 74 69 6d 65 28 26 63 75 72 72 74 69 6d 65  altime(&currtime
130c0 29 29 3b 0a 09 77 72 69 74 65 28 53 54 44 45 52  ));..write(STDER
130d0 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f 67 6d 73 67  R_FILENO, logmsg
130e0 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29  , strlen(logmsg)
130f0 29 3b 0a 0a 09 73 6e 70 72 69 6e 74 66 28 6c 6f  );...snprintf(lo
13100 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67  gmsg, sizeof(log
13110 6d 73 67 29 2c 20 22 45 78 65 63 75 74 69 6e 67  msg), "Executing
13120 20 73 74 61 72 74 20 6d 65 74 68 6f 64 20 28 5c   start method (\
13130 22 25 73 5c 22 29 20 5d 5c 6e 22 2c 20 66 69 6c  "%s\") ]\n", fil
13140 65 6e 61 6d 65 29 3b 0a 09 77 72 69 74 65 28 53  ename);..write(S
13150 54 44 45 52 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f  TDERR_FILENO, lo
13160 67 6d 73 67 2c 20 73 74 72 6c 65 6e 28 6c 6f 67  gmsg, strlen(log
13170 6d 73 67 29 29 3b 0a 0a 09 2f 2a 20 39 2e 20 65  msg));.../* 9. e
13180 78 65 63 76 65 28 29 20 6e 65 77 20 69 6d 61 67  xecve() new imag
13190 65 20 2a 2f 0a 09 61 72 67 76 5b 30 5d 20 3d 20  e */..argv[0] = 
131a0 66 69 6c 65 6e 61 6d 65 3b 0a 09 61 72 67 76 5b  filename;..argv[
131b0 31 5d 20 3d 20 22 73 74 61 72 74 22 3b 0a 09 61  1] = "start";..a
131c0 72 67 76 5b 32 5d 20 3d 20 4e 55 4c 4c 3b 0a 09  rgv[2] = NULL;..
131d0 65 78 65 63 76 65 5f 72 65 74 20 3d 20 65 78 65  execve_ret = exe
131e0 63 76 65 28 66 69 6c 65 6e 61 6d 65 2c 20 61 72  cve(filename, ar
131f0 67 76 2c 20 65 6e 76 76 29 3b 0a 0a 09 2f 2a 20  gv, envv);.../* 
13200 31 30 2e 20 41 62 6f 72 74 20 69 66 20 73 6f 6d  10. Abort if som
13210 65 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20  ething has gone 
13220 77 72 6f 6e 67 20 2a 2f 0a 09 5f 65 78 69 74 28  wrong */.._exit(
13230 65 78 65 63 76 65 5f 72 65 74 29 3b 0a 0a 09 2f  execve_ret);.../
13240 2a 20 48 61 6e 64 6c 65 20 6c 69 6e 74 2d 6e 65  * Handle lint-ne
13250 73 73 20 2a 2f 0a 09 72 65 74 75 72 6e 28 54 43  ss */..return(TC
13260 4c 5f 45 52 52 4f 52 29 3b 0a 09 73 72 69 5f 6f  L_ERROR);..sri_o
13270 62 6a 20 3d 20 73 72 69 5f 6f 62 6a 3b 0a 7d 0a  bj = sri_obj;.}.
13280 0a 69 6e 74 20 54 75 61 70 69 5f 49 6e 69 74 28  .int Tuapi_Init(
13290 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
132a0 72 70 29 20 7b 0a 23 69 66 64 65 66 20 55 53 45  rp) {.#ifdef USE
132b0 5f 54 43 4c 5f 53 54 55 42 53 0a 09 63 6f 6e 73  _TCL_STUBS..cons
132c0 74 20 63 68 61 72 20 2a 74 63 6c 49 6e 69 74 53  t char *tclInitS
132d0 74 75 62 73 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49  tubs_ret;.../* I
132e0 6e 69 74 69 61 6c 69 7a 65 20 53 74 75 62 73 20  nitialize Stubs 
132f0 2a 2f 0a 09 74 63 6c 49 6e 69 74 53 74 75 62 73  */..tclInitStubs
13300 5f 72 65 74 20 3d 20 54 63 6c 5f 49 6e 69 74 53  _ret = Tcl_InitS
13310 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
13320 34 22 2c 20 30 29 3b 0a 09 69 66 20 28 21 74 63  4", 0);..if (!tc
13330 6c 49 6e 69 74 53 74 75 62 73 5f 72 65 74 29 20  lInitStubs_ret) 
13340 7b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  {...return(TCL_E
13350 52 52 4f 52 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  RROR);..}.#endif
13360 0a 0a 09 2f 2a 20 4b 65 72 6e 65 6c 20 6d 61 69  .../* Kernel mai
13370 6e 74 65 6e 61 6e 63 65 20 72 65 6c 61 74 65 64  ntenance related
13380 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 09 54 63   commands */..Tc
13390 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
133a0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75  nd(interp, "::tu
133b0 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69 6e  api::syscall::in
133c0 73 6d 6f 64 22 2c 20 74 75 61 70 69 5f 69 6e 73  smod", tuapi_ins
133d0 6d 6f 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  mod, NULL, NULL)
133e0 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  ;..Tcl_CreateObj
133f0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13400 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  "::tuapi::syscal
13410 6c 3a 3a 72 6d 6d 6f 64 22 2c 20 74 75 61 70 69  l::rmmod", tuapi
13420 5f 72 6d 6d 6f 64 2c 20 4e 55 4c 4c 2c 20 4e 55  _rmmod, NULL, NU
13430 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65  LL);..Tcl_Create
13440 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13450 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  p, "::tuapi::sys
13460 63 61 6c 6c 3a 3a 6c 73 6d 6f 64 22 2c 20 74 75  call::lsmod", tu
13470 61 70 69 5f 6c 73 6d 6f 64 2c 20 4e 55 4c 4c 2c  api_lsmod, NULL,
13480 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65   NULL);..Tcl_Cre
13490 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
134a0 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a  terp, "::tuapi::
134b0 73 79 73 63 61 6c 6c 3a 3a 68 6f 73 74 6e 61 6d  syscall::hostnam
134c0 65 22 2c 20 74 75 61 70 69 5f 68 6f 73 74 6e 61  e", tuapi_hostna
134d0 6d 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  me, NULL, NULL);
134e0 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43  ..Tcl_CreateObjC
134f0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
13500 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c  ::tuapi::syscall
13510 3a 3a 64 6f 6d 61 69 6e 6e 61 6d 65 22 2c 20 74  ::domainname", t
13520 75 61 70 69 5f 64 6f 6d 61 69 6e 6e 61 6d 65 2c  uapi_domainname,
13530 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54   NULL, NULL);..T
13540 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
13550 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
13560 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 6b  uapi::syscall::k
13570 6c 6f 67 63 74 6c 22 2c 20 74 75 61 70 69 5f 6b  logctl", tuapi_k
13580 6c 6f 67 63 74 6c 2c 20 4e 55 4c 4c 2c 20 4e 55  logctl, NULL, NU
13590 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65  LL);..Tcl_Create
135a0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
135b0 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  p, "::tuapi::sys
135c0 63 61 6c 6c 3a 3a 73 65 74 74 69 6d 65 6f 66 64  call::settimeofd
135d0 61 79 22 2c 20 74 75 61 70 69 5f 73 65 74 74 69  ay", tuapi_setti
135e0 6d 65 6f 66 64 61 79 2c 20 4e 55 4c 4c 2c 20 4e  meofday, NULL, N
135f0 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 42 6c 6f 63 6b  ULL);.../* Block
13600 20 6f 72 20 63 68 61 72 20 64 65 76 69 63 65 20   or char device 
13610 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64 73  related commands
13620 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f   */..Tcl_CreateO
13630 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13640 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63  , "::tuapi::sysc
13650 61 6c 6c 3a 3a 6c 6f 73 65 74 75 70 22 2c 20 74  all::losetup", t
13660 75 61 70 69 5f 6c 6f 73 65 74 75 70 2c 20 4e 55  uapi_losetup, NU
13670 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  LL, NULL);..Tcl_
13680 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
13690 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70  (interp, "::tuap
136a0 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 65 6a 65 63  i::syscall::ejec
136b0 74 22 2c 20 74 75 61 70 69 5f 65 6a 65 63 74 2c  t", tuapi_eject,
136c0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
136d0 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 72 65  /* Filesystem re
136e0 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20 2a  lated commands *
136f0 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  /..Tcl_CreateObj
13700 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13710 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  "::tuapi::syscal
13720 6c 3a 3a 6d 6f 75 6e 74 22 2c 20 74 75 61 70 69  l::mount", tuapi
13730 5f 6d 6f 75 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55  _mount, NULL, NU
13740 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65  LL);..Tcl_Create
13750 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13760 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  p, "::tuapi::sys
13770 63 61 6c 6c 3a 3a 75 6d 6f 75 6e 74 22 2c 20 74  call::umount", t
13780 75 61 70 69 5f 75 6d 6f 75 6e 74 2c 20 4e 55 4c  uapi_umount, NUL
13790 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43  L, NULL);..Tcl_C
137a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
137b0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69  interp, "::tuapi
137c0 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 77 61 70 6f  ::syscall::swapo
137d0 6e 22 2c 20 74 75 61 70 69 5f 73 77 61 70 6f 6e  n", tuapi_swapon
137e0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
137f0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
13800 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
13810 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a  tuapi::syscall::
13820 73 77 61 70 6f 66 66 22 2c 20 74 75 61 70 69 5f  swapoff", tuapi_
13830 73 77 61 70 6f 66 66 2c 20 4e 55 4c 4c 2c 20 4e  swapoff, NULL, N
13840 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74  ULL);..Tcl_Creat
13850 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13860 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79  rp, "::tuapi::sy
13870 73 63 61 6c 6c 3a 3a 6d 6b 6e 6f 64 22 2c 20 74  scall::mknod", t
13880 75 61 70 69 5f 6d 6b 6e 6f 64 2c 20 4e 55 4c 4c  uapi_mknod, NULL
13890 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 50 72  , NULL);.../* Pr
138a0 6f 63 65 73 73 20 72 65 6c 61 74 65 64 20 63 6f  ocess related co
138b0 6d 6d 61 6e 64 73 20 2a 2f 0a 09 54 63 6c 5f 43  mmands */..Tcl_C
138c0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
138d0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69  interp, "::tuapi
138e0 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 65 74 75 69  ::syscall::setui
138f0 64 22 2c 20 74 75 61 70 69 5f 73 65 74 75 69 64  d", tuapi_setuid
13900 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
13910 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
13920 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
13930 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a  tuapi::syscall::
13940 67 65 74 75 69 64 22 2c 20 74 75 61 70 69 5f 67  getuid", tuapi_g
13950 65 74 75 69 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  etuid, NULL, NUL
13960 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f  L);..Tcl_CreateO
13970 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13980 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63  , "::tuapi::sysc
13990 61 6c 6c 3a 3a 63 68 72 6f 6f 74 22 2c 20 74 75  all::chroot", tu
139a0 61 70 69 5f 63 68 72 6f 6f 74 2c 20 4e 55 4c 4c  api_chroot, NULL
139b0 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72  , NULL);..Tcl_Cr
139c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
139d0 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a  nterp, "::tuapi:
139e0 3a 73 79 73 63 61 6c 6c 3a 3a 70 69 76 6f 74 5f  :syscall::pivot_
139f0 72 6f 6f 74 22 2c 20 74 75 61 70 69 5f 70 69 76  root", tuapi_piv
13a00 6f 74 5f 72 6f 6f 74 2c 20 4e 55 4c 4c 2c 20 4e  ot_root, NULL, N
13a10 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74  ULL);..Tcl_Creat
13a20 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13a30 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79  rp, "::tuapi::sy
13a40 73 63 61 6c 6c 3a 3a 6b 69 6c 6c 22 2c 20 74 75  scall::kill", tu
13a50 61 70 69 5f 6b 69 6c 6c 2c 20 4e 55 4c 4c 2c 20  api_kill, NULL, 
13a60 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61  NULL);..Tcl_Crea
13a70 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
13a80 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73  erp, "::tuapi::s
13a90 79 73 63 61 6c 6c 3a 3a 77 61 69 74 70 69 64 22  yscall::waitpid"
13aa0 2c 20 74 75 61 70 69 5f 77 61 69 74 70 69 64 2c  , tuapi_waitpid,
13ab0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54   NULL, NULL);..T
13ac0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
13ad0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
13ae0 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 70  uapi::syscall::p
13af0 73 22 2c 20 74 75 61 70 69 5f 70 73 2c 20 4e 55  s", tuapi_ps, NU
13b00 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  LL, NULL);..Tcl_
13b10 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
13b20 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70  (interp, "::tuap
13b30 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 65 78 65 63  i::syscall::exec
13b40 76 65 22 2c 20 74 75 61 70 69 5f 65 78 65 63 76  ve", tuapi_execv
13b50 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  e, NULL, NULL);.
13b60 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
13b70 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
13b80 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a  :tuapi::syscall:
13b90 3a 72 6c 69 6d 69 74 22 2c 20 74 75 61 70 69 5f  :rlimit", tuapi_
13ba0 72 6c 69 6d 69 74 2c 20 4e 55 4c 4c 2c 20 4e 55  rlimit, NULL, NU
13bb0 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65  LL);..Tcl_Create
13bc0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13bd0 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  p, "::tuapi::sys
13be0 63 61 6c 6c 3a 3a 72 65 62 6f 6f 74 22 2c 20 74  call::reboot", t
13bf0 75 61 70 69 5f 72 65 62 6f 6f 74 2c 20 4e 55 4c  uapi_reboot, NUL
13c00 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 4e  L, NULL);.../* N
13c10 65 74 77 6f 72 6b 20 72 65 6c 61 74 65 64 20 63  etwork related c
13c20 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 09 54 63 6c 5f  ommands */..Tcl_
13c30 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
13c40 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70  (interp, "::tuap
13c50 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69 66 63 6f  i::syscall::ifco
13c60 6e 66 69 67 22 2c 20 74 75 61 70 69 5f 69 66 63  nfig", tuapi_ifc
13c70 6f 6e 66 69 67 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  onfig, NULL, NUL
13c80 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f  L);..Tcl_CreateO
13c90 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13ca0 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63  , "::tuapi::sysc
13cb0 61 6c 6c 3a 3a 72 6f 75 74 65 22 2c 20 74 75 61  all::route", tua
13cc0 70 69 5f 72 6f 75 74 65 2c 20 4e 55 4c 4c 2c 20  pi_route, NULL, 
13cd0 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61  NULL);..Tcl_Crea
13ce0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
13cf0 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73  erp, "::tuapi::s
13d00 79 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 22 2c 20  yscall::brctl", 
13d10 74 75 61 70 69 5f 62 72 63 74 6c 2c 20 4e 55 4c  tuapi_brctl, NUL
13d20 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43  L, NULL);..Tcl_C
13d30 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13d40 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69  interp, "::tuapi
13d50 3a 3a 73 79 73 63 61 6c 6c 3a 3a 76 63 6f 6e 66  ::syscall::vconf
13d60 69 67 22 2c 20 74 75 61 70 69 5f 76 63 6f 6e 66  ig", tuapi_vconf
13d70 69 67 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  ig, NULL, NULL);
13d80 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 6c 20 72  .../* Terminal r
13d90 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20  elated commands 
13da0 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62  */..Tcl_CreateOb
13db0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13dc0 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61   "::tuapi::sysca
13dd0 6c 6c 3a 3a 73 74 74 79 22 2c 20 74 75 61 70 69  ll::stty", tuapi
13de0 5f 73 74 74 79 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  _stty, NULL, NUL
13df0 4c 29 3b 0a 0a 09 2f 2a 20 4e 65 65 64 65 64 20  L);.../* Needed 
13e00 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 61 73  commands for bas
13e10 69 63 20 73 65 72 76 69 63 65 73 20 54 63 6c 20  ic services Tcl 
13e20 6c 61 63 6b 73 20 2a 2f 0a 09 54 63 6c 5f 43 72  lacks */..Tcl_Cr
13e30 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13e40 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a  nterp, "::tuapi:
13e50 3a 73 79 73 63 61 6c 6c 3a 3a 73 6f 63 6b 65 74  :syscall::socket
13e60 5f 75 6e 69 78 22 2c 20 74 75 61 70 69 5f 73 6f  _unix", tuapi_so
13e70 63 6b 65 74 5f 75 6e 69 78 2c 20 4e 55 4c 4c 2c  cket_unix, NULL,
13e80 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 53 65 72   NULL);.../* Ser
13e90 76 69 63 65 20 28 54 53 4d 46 29 20 72 65 6c 61  vice (TSMF) rela
13ea0 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a  ted commands */.
13eb0 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
13ec0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
13ed0 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a  :tuapi::syscall:
13ee0 3a 74 73 6d 66 5f 73 74 61 72 74 5f 73 76 63 22  :tsmf_start_svc"
13ef0 2c 20 74 75 61 70 69 5f 74 73 6d 66 5f 73 74 61  , tuapi_tsmf_sta
13f00 72 74 5f 73 76 63 2c 20 4e 55 4c 4c 2c 20 4e 55  rt_svc, NULL, NU
13f10 4c 4c 29 3b 0a 0a 09 2f 2a 20 49 6e 74 65 72 6e  LL);.../* Intern
13f20 61 6c 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  al functions */.
13f30 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
13f40 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
13f50 3a 74 75 61 70 69 3a 3a 69 6e 74 65 72 6e 61 6c  :tuapi::internal
13f60 3a 3a 68 61 73 68 22 2c 20 74 75 61 70 69 5f 69  ::hash", tuapi_i
13f70 6e 74 65 72 6e 61 6c 70 72 6f 63 5f 73 69 6d 70  nternalproc_simp
13f80 6c 65 68 61 73 68 2c 20 4e 55 4c 4c 2c 20 4e 55  lehash, NULL, NU
13f90 4c 4c 29 3b 0a 0a 09 2f 2a 20 44 65 66 69 6e 65  LL);.../* Define
13fa0 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 09 2f   constants */../
13fb0 2a 2a 20 43 72 65 61 74 65 20 70 61 72 65 6e 74  ** Create parent
13fc0 20 6e 61 6d 65 73 70 61 63 65 20 2a 2a 2f 0a 09   namespace **/..
13fd0 54 63 6c 5f 43 72 65 61 74 65 4e 61 6d 65 73 70  Tcl_CreateNamesp
13fe0 61 63 65 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  ace(interp, "::t
13ff0 75 61 70 69 3a 3a 63 6f 6e 73 74 22 2c 20 4e 55  uapi::const", NU
14000 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 2a  LL, NULL);.../**
14010 20 44 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   Define constant
14020 73 2c 20 66 6f 72 20 72 65 61 6c 20 2a 2a 2f 0a  s, for real **/.
14030 09 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28  .Tcl_ObjSetVar2(
14040 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
14050 74 72 69 6e 67 4f 62 6a 28 22 3a 3a 74 75 61 70  tringObj("::tuap
14060 69 3a 3a 63 6f 6e 73 74 3a 3a 48 4f 53 54 5f 4e  i::const::HOST_N
14070 41 4d 45 5f 4d 41 58 22 2c 20 2d 31 29 2c 20 4e  AME_MAX", -1), N
14080 55 4c 4c 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  ULL, Tcl_NewWide
14090 49 6e 74 4f 62 6a 28 48 4f 53 54 5f 4e 41 4d 45  IntObj(HOST_NAME
140a0 5f 4d 41 58 29 2c 20 54 43 4c 5f 47 4c 4f 42 41  _MAX), TCL_GLOBA
140b0 4c 5f 4f 4e 4c 59 29 3b 0a 0a 09 2f 2a 20 43 72  L_ONLY);.../* Cr
140c0 65 61 74 65 20 68 69 67 68 2d 6c 65 76 65 6c 20  eate high-level 
140d0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 2a  user functions *
140e0 2f 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65  /..Tcl_Eval(inte
140f0 72 70 2c 0a 23 69 6e 63 6c 75 64 65 20 22 74 75  rp,.#include "tu
14100 61 70 69 2e 74 63 6c 2e 68 22 20 0a 09 29 3b 0a  api.tcl.h" ..);.
14110 0a 09 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65  ..Tcl_PkgProvide
14120 28 69 6e 74 65 72 70 2c 20 22 74 75 61 70 69 22  (interp, "tuapi"
14130 2c 20 22 30 2e 37 22 29 3b 0a 0a 09 72 65 74 75  , "0.7");...retu
14140 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a        rn(TCL_OK);.}.