Hex Artifact Content

Artifact 1d22e5c805490e3effceaaec92558eaccb23c568:


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 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
3c50: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
3c60: 61 70 69 5f 67 65 74 75 69 64 28 43 6c 69 65 6e  api_getuid(Clien
3c70: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
3c80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
3c90: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
3ca0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
3cb0: 0a 09 75 69 64 5f 74 20 75 69 64 3b 0a 09 54 63  ..uid_t uid;..Tc
3cc0: 6c 5f 57 69 64 65 49 6e 74 20 74 63 6c 55 69 64  l_WideInt tclUid
3cd0: 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d 20  ;...if (objc != 
3ce0: 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  1) {...Tcl_SetOb
3cf0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
3d00: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3d10: 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ("wrong # args: 
3d20: 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75  should be \"::tu
3d30: 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 67 65  api::syscall::ge
3d40: 74 75 69 64 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a  tuid\"", -1));..
3d50: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
3d60: 4f 52 29 3b 0a 09 7d 0a 0a 09 75 69 64 20 3d 20  OR);..}...uid = 
3d70: 67 65 74 75 69 64 28 29 3b 0a 09 74 63 6c 55 69  getuid();..tclUi
3d80: 64 20 3d 20 75 69 64 3b 0a 0a 09 54 63 6c 5f 53  d = uid;...Tcl_S
3d90: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3da0: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
3db0: 6e 74 4f 62 6a 28 74 63 6c 55 69 64 29 29 3b 0a  ntObj(tclUid));.
3dc0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29  ..return(TCL_OK)
3dd0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
3de0: 74 75 61 70 69 5f 6b 69 6c 6c 28 43 6c 69 65 6e  tuapi_kill(Clien
3df0: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
3e00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
3e10: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
3e20: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
3e30: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 73 69 67 6e 61  ..Tcl_Obj *signa
3e40: 6c 5f 6f 62 6a 3b 0a 0a 09 54 63 6c 5f 57 69 64  l_obj;...Tcl_Wid
3e50: 65 49 6e 74 20 70 69 64 5f 77 69 64 65 2c 20 73  eInt pid_wide, s
3e60: 69 67 5f 77 69 64 65 3b 0a 09 70 69 64 5f 74 20  ig_wide;..pid_t 
3e70: 70 69 64 3b 0a 09 69 6e 74 20 73 69 67 3b 0a 09  pid;..int sig;..
3e80: 69 6e 74 20 6b 69 6c 6c 5f 72 65 74 2c 20 74 63  int kill_ret, tc
3e90: 6c 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a  l_ret;...if (obj
3ea0: 63 20 21 3d 20 33 29 20 7b 0a 09 09 54 63 6c 5f  c != 3) {...Tcl_
3eb0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
3ec0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
3ed0: 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61  ngObj("wrong # a
3ee0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
3ef0: 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  "::tuapi::syscal
3f00: 6c 3a 3a 6b 69 6c 6c 20 70 69 64 20 73 69 67 5c  l::kill pid sig\
3f10: 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74  "", -1));....ret
3f20: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
3f30: 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54  .}...tcl_ret = T
3f40: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
3f50: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
3f60: 76 5b 31 5d 2c 20 26 70 69 64 5f 77 69 64 65 29  v[1], &pid_wide)
3f70: 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21  ;..if (tcl_ret !
3f80: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
3f90: 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09  turn(tcl_ret);..
3fa0: 7d 0a 09 70 69 64 20 3d 20 70 69 64 5f 77 69 64  }..pid = pid_wid
3fb0: 65 3b 0a 0a 09 73 69 67 6e 61 6c 5f 6f 62 6a 20  e;...signal_obj 
3fc0: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 0a 09 74 63 6c  = objv[2];...tcl
3fd0: 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 57 69  _ret = Tcl_GetWi
3fe0: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
3ff0: 65 72 70 2c 20 73 69 67 6e 61 6c 5f 6f 62 6a 2c  erp, signal_obj,
4000: 20 26 73 69 67 5f 77 69 64 65 29 3b 0a 09 69 66   &sig_wide);..if
4010: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
4020: 5f 4f 4b 29 20 7b 0a 09 09 73 77 69 74 63 68 20  _OK) {...switch 
4030: 28 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f  (tuapi_internal_
4040: 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 73  simplehash_obj(s
4050: 69 67 6e 61 6c 5f 6f 62 6a 29 29 20 7b 0a 09 09  ignal_obj)) {...
4060: 09 63 61 73 65 20 30 78 31 32 32 61 64 30 3a 20  .case 0x122ad0: 
4070: 2f 2a 20 48 55 50 20 2a 2f 0a 09 09 09 63 61 73  /* HUP */....cas
4080: 65 20 30 78 39 38 66 33 36 34 64 30 3a 20 2f 2a  e 0x98f364d0: /*
4090: 20 53 49 47 48 55 50 20 2a 2f 0a 09 09 09 09 73   SIGHUP */.....s
40a0: 69 67 20 3d 20 53 49 47 48 55 50 3b 0a 09 09 09  ig = SIGHUP;....
40b0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
40c0: 30 78 31 32 36 37 35 34 3a 20 2f 2a 20 49 4e 54  0x126754: /* INT
40d0: 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 39 38   */....case 0x98
40e0: 66 33 32 39 35 34 3a 20 2f 2a 20 53 49 47 49 4e  f32954: /* SIGIN
40f0: 54 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53  T */.....sig = S
4100: 49 47 49 4e 54 3b 0a 09 09 09 09 62 72 65 61 6b  IGINT;.....break
4110: 3b 0a 09 09 09 63 61 73 65 20 30 78 61 33 35 36  ;....case 0xa356
4120: 34 64 34 3a 20 2f 2a 20 51 55 49 54 20 2a 2f 0a  4d4: /* QUIT */.
4130: 09 09 09 63 61 73 65 20 30 78 37 61 39 32 34 32  ...case 0x7a9242
4140: 64 34 3a 20 2f 2a 20 53 49 47 51 55 49 54 20 2a  d4: /* SIGQUIT *
4150: 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 51  /.....sig = SIGQ
4160: 55 49 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  UIT;.....break;.
4170: 09 09 09 63 61 73 65 20 30 78 31 32 36 36 34 63  ...case 0x12664c
4180: 3a 20 2f 2a 20 49 4c 4c 20 2a 2f 0a 09 09 09 63  : /* ILL */....c
4190: 61 73 65 20 30 78 39 38 66 33 32 38 34 63 3a 20  ase 0x98f3284c: 
41a0: 2f 2a 20 53 49 47 49 4c 4c 20 2a 2f 0a 09 09 09  /* SIGILL */....
41b0: 09 73 69 67 20 3d 20 53 49 47 49 4c 4c 3b 0a 09  .sig = SIGILL;..
41c0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
41d0: 65 20 30 78 61 39 34 61 30 64 30 3a 20 2f 2a 20  e 0xa94a0d0: /* 
41e0: 54 52 41 50 20 2a 2f 0a 09 09 09 63 61 73 65 20  TRAP */....case 
41f0: 30 78 37 61 33 33 38 36 64 30 3a 20 2f 2a 20 53  0x7a3386d0: /* S
4200: 49 47 54 52 41 50 20 2a 2f 0a 09 09 09 09 73 69  IGTRAP */.....si
4210: 67 20 3d 20 53 49 47 54 52 41 50 3b 0a 09 09 09  g = SIGTRAP;....
4220: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
4230: 30 78 38 33 30 61 39 35 34 3a 20 2f 2a 20 41 42  0x830a954: /* AB
4240: 52 54 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  RT */....case 0x
4250: 37 38 39 37 38 66 35 34 3a 20 2f 2a 20 53 49 47  78978f54: /* SIG
4260: 41 42 52 54 20 2a 2f 0a 09 09 09 09 73 69 67 20  ABRT */.....sig 
4270: 3d 20 53 49 47 41 42 52 54 3b 0a 09 09 09 09 62  = SIGABRT;.....b
4280: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
4290: 31 32 36 37 64 34 3a 20 2f 2a 20 49 4f 54 20 2a  1267d4: /* IOT *
42a0: 2f 0a 09 09 09 63 61 73 65 20 30 78 39 38 66 33  /....case 0x98f3
42b0: 32 39 64 34 3a 20 2f 2a 20 53 49 47 49 4f 54 20  29d4: /* SIGIOT 
42c0: 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47  */.....sig = SIG
42d0: 49 4f 54 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  IOT;.....break;.
42e0: 09 09 09 63 61 73 65 20 30 78 31 30 61 61 64 33  ...case 0x10aad3
42f0: 3a 20 2f 2a 20 42 55 53 20 2a 2f 0a 09 09 09 63  : /* BUS */....c
4300: 61 73 65 20 30 78 39 38 66 31 65 34 64 33 3a 20  ase 0x98f1e4d3: 
4310: 2f 2a 20 53 49 47 42 55 53 20 2a 2f 0a 09 09 09  /* SIGBUS */....
4320: 09 73 69 67 20 3d 20 53 49 47 42 55 53 3b 0a 09  .sig = SIGBUS;..
4330: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
4340: 65 20 30 78 31 31 61 38 34 35 3a 20 2f 2a 20 46  e 0x11a845: /* F
4350: 50 45 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  PE */....case 0x
4360: 39 38 66 30 65 36 34 35 3a 20 2f 2a 20 53 49 47  98f0e645: /* SIG
4370: 46 50 45 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d  FPE */.....sig =
4380: 20 53 49 47 46 50 45 3b 0a 09 09 09 09 62 72 65   SIGFPE;.....bre
4390: 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 39 37  ak;....case 0x97
43a0: 32 36 36 34 63 3a 20 2f 2a 20 4b 49 4c 4c 20 2a  2664c: /* KILL *
43b0: 2f 0a 09 09 09 63 61 73 65 20 30 78 37 39 64 35  /....case 0x79d5
43c0: 34 30 34 63 3a 20 2f 2a 20 53 49 47 4b 49 4c 4c  404c: /* SIGKILL
43d0: 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49   */.....sig = SI
43e0: 47 4b 49 4c 4c 3b 0a 09 09 09 09 62 72 65 61 6b  GKILL;.....break
43f0: 3b 0a 09 09 09 63 61 73 65 20 30 78 61 62 34 65  ;....case 0xab4e
4400: 39 33 31 3a 20 2f 2a 20 55 53 52 31 20 2a 2f 0a  931: /* USR1 */.
4410: 09 09 09 63 61 73 65 20 30 78 37 61 31 33 63 66  ...case 0x7a13cf
4420: 33 31 3a 20 2f 2a 20 53 49 47 55 53 52 31 20 2a  31: /* SIGUSR1 *
4430: 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 55  /.....sig = SIGU
4440: 53 52 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  SR1;.....break;.
4450: 09 09 09 63 61 73 65 20 30 78 61 37 31 36 33 64  ...case 0xa7163d
4460: 36 3a 20 2f 2a 20 53 45 47 56 20 2a 2f 0a 09 09  6: /* SEGV */...
4470: 09 63 61 73 65 20 30 78 37 61 64 36 34 35 64 36  .case 0x7ad645d6
4480: 3a 20 2f 2a 20 53 49 47 53 45 47 56 20 2a 2f 0a  : /* SIGSEGV */.
4490: 09 09 09 09 73 69 67 20 3d 20 53 49 47 53 45 47  ....sig = SIGSEG
44a0: 56 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  V;.....break;...
44b0: 09 63 61 73 65 20 30 78 61 62 34 65 39 33 32 3a  .case 0xab4e932:
44c0: 20 2f 2a 20 55 53 52 32 20 2a 2f 0a 09 09 09 63   /* USR2 */....c
44d0: 61 73 65 20 30 78 37 61 31 33 63 66 33 32 3a 20  ase 0x7a13cf32: 
44e0: 2f 2a 20 53 49 47 55 53 52 32 20 2a 2f 0a 09 09  /* SIGUSR2 */...
44f0: 09 09 73 69 67 20 3d 20 53 49 47 55 53 52 32 3b  ..sig = SIGUSR2;
4500: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
4510: 61 73 65 20 30 78 61 31 32 36 38 34 35 3a 20 2f  ase 0xa126845: /
4520: 2a 20 50 49 50 45 20 2a 2f 0a 09 09 09 63 61 73  * PIPE */....cas
4530: 65 20 30 78 37 61 62 35 34 65 34 35 3a 20 2f 2a  e 0x7ab54e45: /*
4540: 20 53 49 47 50 49 50 45 20 2a 2f 0a 09 09 09 09   SIGPIPE */.....
4550: 73 69 67 20 3d 20 53 49 47 50 49 50 45 3b 0a 09  sig = SIGPIPE;..
4560: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
4570: 65 20 30 78 38 33 33 32 39 34 64 3a 20 2f 2a 20  e 0x833294d: /* 
4580: 41 4c 52 4d 20 2a 2f 0a 09 09 09 63 61 73 65 20  ALRM */....case 
4590: 30 78 37 38 39 34 30 66 34 64 3a 20 2f 2a 20 53  0x78940f4d: /* S
45a0: 49 47 41 4c 52 4d 20 2a 2f 0a 09 09 09 09 73 69  IGALRM */.....si
45b0: 67 20 3d 20 53 49 47 41 4c 52 4d 3b 0a 09 09 09  g = SIGALRM;....
45c0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
45d0: 30 78 61 39 31 36 39 34 64 3a 20 2f 2a 20 54 45  0xa91694d: /* TE
45e0: 52 4d 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  RM */....case 0x
45f0: 37 61 33 36 34 66 34 64 3a 20 2f 2a 20 53 49 47  7a364f4d: /* SIG
4600: 54 45 52 4d 20 2a 2f 0a 09 09 09 09 73 69 67 20  TERM */.....sig 
4610: 3d 20 53 49 47 54 45 52 4d 3b 0a 09 09 09 09 62  = SIGTERM;.....b
4620: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
4630: 34 39 37 30 65 38 64 34 3a 20 2f 2a 20 53 54 4b  4970e8d4: /* STK
4640: 46 4c 54 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  FLT */....case 0
4650: 78 38 30 66 65 66 63 35 34 3a 20 2f 2a 20 53 49  x80fefc54: /* SI
4660: 47 53 54 4b 46 4c 54 20 2a 2f 0a 09 09 09 09 73  GSTKFLT */.....s
4670: 69 67 20 3d 20 53 49 47 53 54 4b 46 4c 54 3b 0a  ig = SIGSTKFLT;.
4680: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
4690: 73 65 20 30 78 38 37 32 32 36 34 34 3a 20 2f 2a  se 0x8722644: /*
46a0: 20 43 48 4c 44 20 2a 2f 0a 09 09 09 63 61 73 65   CHLD */....case
46b0: 20 30 78 37 38 64 35 30 30 34 34 3a 20 2f 2a 20   0x78d50044: /* 
46c0: 53 49 47 43 48 4c 44 20 2a 2f 0a 09 09 09 09 73  SIGCHLD */.....s
46d0: 69 67 20 3d 20 53 49 47 43 48 4c 44 3b 0a 09 09  ig = SIGCHLD;...
46e0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
46f0: 20 30 78 38 37 33 65 37 35 34 3a 20 2f 2a 20 43   0x873e754: /* C
4700: 4f 4e 54 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  ONT */....case 0
4710: 78 37 38 64 34 63 31 35 34 3a 20 2f 2a 20 53 49  x78d4c154: /* SI
4720: 47 43 4f 4e 54 20 2a 2f 0a 09 09 09 09 73 69 67  GCONT */.....sig
4730: 20 3d 20 53 49 47 43 4f 4e 54 3b 0a 09 09 09 09   = SIGCONT;.....
4740: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
4750: 78 61 37 35 32 37 64 30 3a 20 2f 2a 20 53 54 4f  xa7527d0: /* STO
4760: 50 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37  P */....case 0x7
4770: 61 64 32 30 31 64 30 3a 20 2f 2a 20 53 49 47 53  ad201d0: /* SIGS
4780: 54 4f 50 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d  TOP */.....sig =
4790: 20 53 49 47 53 54 4f 50 3b 0a 09 09 09 09 62 72   SIGSTOP;.....br
47a0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 61  eak;....case 0xa
47b0: 39 34 65 61 35 30 3a 20 2f 2a 20 54 53 54 50 20  94ea50: /* TSTP 
47c0: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37 61 33  */....case 0x7a3
47d0: 33 63 63 35 30 3a 20 2f 2a 20 53 49 47 54 53 54  3cc50: /* SIGTST
47e0: 50 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53  P */.....sig = S
47f0: 49 47 54 53 54 50 3b 0a 09 09 09 09 62 72 65 61  IGTSTP;.....brea
4800: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 61 39 35  k;....case 0xa95
4810: 32 34 63 65 3a 20 2f 2a 20 54 54 49 4e 20 2a 2f  24ce: /* TTIN */
4820: 0a 09 09 09 63 61 73 65 20 30 78 37 61 33 32 30  ....case 0x7a320
4830: 32 63 65 3a 20 2f 2a 20 53 49 47 54 54 49 4e 20  2ce: /* SIGTTIN 
4840: 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47  */.....sig = SIG
4850: 54 54 49 4e 3b 0a 09 09 09 09 62 72 65 61 6b 3b  TTIN;.....break;
4860: 0a 09 09 09 63 61 73 65 20 30 78 61 39 35 32 37  ....case 0xa9527
4870: 64 35 3a 20 2f 2a 20 54 54 4f 55 20 2a 2f 0a 09  d5: /* TTOU */..
4880: 09 09 63 61 73 65 20 30 78 37 61 33 32 30 31 64  ..case 0x7a3201d
4890: 35 3a 20 2f 2a 20 53 49 47 54 54 4f 55 20 2a 2f  5: /* SIGTTOU */
48a0: 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47 54 54  .....sig = SIGTT
48b0: 4f 55 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  OU;.....break;..
48c0: 09 09 63 61 73 65 20 30 78 31 35 36 39 34 37 3a  ..case 0x156947:
48d0: 20 2f 2a 20 55 52 47 20 2a 2f 0a 09 09 09 63 61   /* URG */....ca
48e0: 73 65 20 30 78 39 38 66 34 32 37 34 37 3a 20 2f  se 0x98f42747: /
48f0: 2a 20 53 49 47 55 52 47 20 2a 2f 0a 09 09 09 09  * SIGURG */.....
4900: 73 69 67 20 3d 20 53 49 47 55 52 47 3b 0a 09 09  sig = SIGURG;...
4910: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
4920: 20 30 78 62 31 30 65 38 35 35 3a 20 2f 2a 20 58   0xb10e855: /* X
4930: 43 50 55 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  CPU */....case 0
4940: 78 37 62 62 37 63 65 35 35 3a 20 2f 2a 20 53 49  x7bb7ce55: /* SI
4950: 47 58 43 50 55 20 2a 2f 0a 09 09 09 09 73 69 67  GXCPU */.....sig
4960: 20 3d 20 53 49 47 58 43 50 55 3b 0a 09 09 09 09   = SIGXCPU;.....
4970: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
4980: 78 62 31 31 61 39 64 61 3a 20 2f 2a 20 58 46 53  xb11a9da: /* XFS
4990: 5a 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 37  Z */....case 0x7
49a0: 62 62 36 38 66 64 61 3a 20 2f 2a 20 53 49 47 58  bb68fda: /* SIGX
49b0: 46 53 5a 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d  FSZ */.....sig =
49c0: 20 53 49 47 58 46 53 5a 3b 0a 09 09 09 09 62 72   SIGXFSZ;.....br
49d0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 34  eak;....case 0x4
49e0: 38 33 32 37 33 63 64 3a 20 2f 2a 20 56 54 41 4c  83273cd: /* VTAL
49f0: 52 4d 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  RM */....case 0x
4a00: 38 31 62 63 36 37 34 64 3a 20 2f 2a 20 53 49 47  81bc674d: /* SIG
4a10: 56 54 41 4c 52 4d 20 2a 2f 0a 09 09 09 09 73 69  VTALRM */.....si
4a20: 67 20 3d 20 53 49 47 56 54 41 4c 52 4d 3b 0a 09  g = SIGVTALRM;..
4a30: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
4a40: 65 20 30 78 61 31 34 61 37 63 36 3a 20 2f 2a 20  e 0xa14a7c6: /* 
4a50: 50 52 4f 46 20 2a 2f 0a 09 09 09 63 61 73 65 20  PROF */....case 
4a60: 30 78 37 61 62 33 38 31 63 36 3a 20 2f 2a 20 53  0x7ab381c6: /* S
4a70: 49 47 50 52 4f 46 20 2a 2f 0a 09 09 09 09 73 69  IGPROF */.....si
4a80: 67 20 3d 20 53 49 47 50 52 4f 46 3b 0a 09 09 09  g = SIGPROF;....
4a90: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
4aa0: 30 78 37 39 33 33 61 33 34 38 3a 20 2f 2a 20 57  0x7933a348: /* W
4ab0: 49 4e 43 48 20 2a 2f 0a 09 09 09 63 61 73 65 20  INCH */....case 
4ac0: 30 78 32 61 61 30 62 66 34 38 3a 20 2f 2a 20 53  0x2aa0bf48: /* S
4ad0: 49 47 57 49 4e 43 48 20 2a 2f 0a 09 09 09 09 73  IGWINCH */.....s
4ae0: 69 67 20 3d 20 53 49 47 57 49 4e 43 48 3b 0a 09  ig = SIGWINCH;..
4af0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
4b00: 65 20 30 78 32 34 63 66 3a 20 2f 2a 20 49 4f 20  e 0x24cf: /* IO 
4b10: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 33 39 33  */....case 0x393
4b20: 31 65 36 34 66 3a 20 2f 2a 20 53 49 47 49 4f 20  1e64f: /* SIGIO 
4b30: 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20 53 49 47  */.....sig = SIG
4b40: 49 4f 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  IO;.....break;..
4b50: 09 09 63 61 73 65 20 30 78 31 34 32 62 64 32 3a  ..case 0x142bd2:
4b60: 20 2f 2a 20 50 57 52 20 2a 2f 0a 09 09 09 63 61   /* PWR */....ca
4b70: 73 65 20 30 78 39 38 66 35 36 35 64 32 3a 20 2f  se 0x98f565d2: /
4b80: 2a 20 53 49 47 50 57 52 20 2a 2f 0a 09 09 09 09  * SIGPWR */.....
4b90: 73 69 67 20 3d 20 53 49 47 50 57 52 3b 0a 09 09  sig = SIGPWR;...
4ba0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
4bb0: 20 30 78 31 34 65 63 64 33 3a 20 2f 2a 20 53 59   0x14ecd3: /* SY
4bc0: 53 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 39  S */....case 0x9
4bd0: 38 66 35 61 32 64 33 3a 20 2f 2a 20 53 49 47 53  8f5a2d3: /* SIGS
4be0: 59 53 20 2a 2f 0a 09 09 09 09 73 69 67 20 3d 20  YS */.....sig = 
4bf0: 53 49 47 53 59 53 3b 0a 09 09 09 09 62 72 65 61  SIGSYS;.....brea
4c00: 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
4c10: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
4c20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
4c30: 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e 6b 6e 6f  ObjPrintf("unkno
4c40: 77 6e 20 73 69 67 6e 61 6c 20 5c 22 25 73 5c 22  wn signal \"%s\"
4c50: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
4c60: 28 73 69 67 6e 61 6c 5f 6f 62 6a 29 29 29 3b 0a  (signal_obj)));.
4c70: 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  .....return(TCL_
4c80: 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 20 65  ERROR);...}..} e
4c90: 6c 73 65 20 7b 0a 09 09 73 69 67 20 3d 20 73 69  lse {...sig = si
4ca0: 67 5f 77 69 64 65 3b 0a 09 7d 0a 0a 09 6b 69 6c  g_wide;..}...kil
4cb0: 6c 5f 72 65 74 20 3d 20 6b 69 6c 6c 28 70 69 64  l_ret = kill(pid
4cc0: 2c 20 73 69 67 29 3b 0a 09 69 66 20 28 6b 69 6c  , sig);..if (kil
4cd0: 6c 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  l_ret != 0) {...
4ce0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
4cf0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
4d00: 53 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72  StringObj(strerr
4d10: 6f 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b  or(errno), -1));
4d20: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
4d30: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  RROR);..}...retu
4d40: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73  rn(TCL_OK);.}..s
4d50: 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
4d60: 72 65 62 6f 6f 74 28 43 6c 69 65 6e 74 44 61 74  reboot(ClientDat
4d70: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  a cd, Tcl_Interp
4d80: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
4d90: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  jc, Tcl_Obj *CON
4da0: 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63  ST objv[]) {..Tc
4db0: 6c 5f 4f 62 6a 20 2a 63 6d 64 5f 6f 62 6a 3b 0a  l_Obj *cmd_obj;.
4dc0: 09 69 6e 74 20 63 6d 64 3b 0a 09 69 6e 74 20 72  .int cmd;..int r
4dd0: 65 62 6f 6f 74 5f 72 65 74 3b 0a 0a 09 69 66 20  eboot_ret;...if 
4de0: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 09  (objc == 2) {...
4df0: 63 6d 64 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31  cmd_obj = objv[1
4e00: 5d 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 74 75  ];....switch (tu
4e10: 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d  api_internal_sim
4e20: 70 6c 65 68 61 73 68 5f 6f 62 6a 28 63 6d 64 5f  plehash_obj(cmd_
4e30: 6f 62 6a 29 29 20 7b 0a 09 09 09 63 61 73 65 20  obj)) {....case 
4e40: 30 78 32 62 65 31 39 34 36 3a 20 2f 2a 20 4c 49  0x2be1946: /* LI
4e50: 4e 55 58 5f 52 45 42 4f 4f 54 5f 43 4d 44 5f 43  NUX_REBOOT_CMD_C
4e60: 41 44 5f 4f 46 46 20 2a 2f 0a 09 09 09 63 61 73  AD_OFF */....cas
4e70: 65 20 30 78 36 36 36 65 36 33 34 34 3a 20 2f 2a  e 0x666e6344: /*
4e80: 20 52 42 5f 44 49 53 41 42 4c 45 5f 43 41 44 20   RB_DISABLE_CAD 
4e90: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 39 65 33  */....case 0x9e3
4ea0: 63 65 36 34 34 3a 20 2f 2a 20 44 49 53 41 42 4c  ce644: /* DISABL
4eb0: 45 5f 43 41 44 20 2a 2f 0a 09 09 09 09 63 6d 64  E_CAD */.....cmd
4ec0: 20 3d 20 52 42 5f 44 49 53 41 42 4c 45 5f 43 41   = RB_DISABLE_CA
4ed0: 44 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  D;......break;..
4ee0: 09 09 63 61 73 65 20 30 78 65 38 30 35 37 63 34  ..case 0xe8057c4
4ef0: 65 3a 20 2f 2a 20 4c 49 4e 55 58 5f 52 45 42 4f  e: /* LINUX_REBO
4f00: 4f 54 5f 43 4d 44 5f 43 41 44 5f 4f 4e 20 2a 2f  OT_CMD_CAD_ON */
4f10: 0a 09 09 09 63 61 73 65 20 30 78 66 38 64 63 34  ....case 0xf8dc4
4f20: 34 34 3a 20 2f 2a 20 52 42 5f 45 4e 41 42 4c 45  44: /* RB_ENABLE
4f30: 5f 43 41 44 20 2a 2f 0a 09 09 09 63 61 73 65 20  _CAD */....case 
4f40: 30 78 31 61 37 64 36 31 34 34 3a 20 2f 2a 20 45  0x1a7d6144: /* E
4f50: 4e 41 42 4c 45 5f 43 41 44 20 2a 2f 0a 09 09 09  NABLE_CAD */....
4f60: 09 63 6d 64 20 3d 20 52 42 5f 45 4e 41 42 4c 45  .cmd = RB_ENABLE
4f70: 5f 43 41 44 3b 0a 0a 09 09 09 09 62 72 65 61 6b  _CAD;......break
4f80: 3b 0a 09 09 09 63 61 73 65 20 30 78 39 35 62 66  ;....case 0x95bf
4f90: 61 34 35 34 3a 20 2f 2a 20 4c 49 4e 55 58 5f 52  a454: /* LINUX_R
4fa0: 45 42 4f 4f 54 5f 43 4d 44 5f 48 41 4c 54 20 2a  EBOOT_CMD_HALT *
4fb0: 2f 0a 09 09 09 63 61 73 65 20 30 78 33 32 31 30  /....case 0x3210
4fc0: 64 61 34 64 3a 20 2f 2a 20 52 42 5f 48 41 4c 54  da4d: /* RB_HALT
4fd0: 5f 53 59 53 54 45 4d 20 2a 2f 0a 09 09 09 63 61  _SYSTEM */....ca
4fe0: 73 65 20 30 78 63 61 34 32 35 66 34 64 3a 20 2f  se 0xca425f4d: /
4ff0: 2a 20 48 41 4c 54 5f 53 59 53 54 45 4d 20 2a 2f  * HALT_SYSTEM */
5000: 0a 09 09 09 63 61 73 65 20 30 78 39 31 30 36 36  ....case 0x91066
5010: 35 34 3a 20 2f 2a 20 48 41 4c 54 20 2a 2f 0a 09  54: /* HALT */..
5020: 09 09 09 63 6d 64 20 3d 20 52 42 5f 48 41 4c 54  ...cmd = RB_HALT
5030: 5f 53 59 53 54 45 4d 3b 0a 0a 09 09 09 09 62 72  _SYSTEM;......br
5040: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 64  eak;....case 0xd
5050: 62 35 35 64 38 63 36 3a 20 2f 2a 20 4c 49 4e 55  b55d8c6: /* LINU
5060: 58 5f 52 45 42 4f 4f 54 5f 43 4d 44 5f 50 4f 57  X_REBOOT_CMD_POW
5070: 45 52 5f 4f 46 46 20 2a 2f 0a 09 09 09 63 61 73  ER_OFF */....cas
5080: 65 20 30 78 66 30 37 37 30 30 63 36 3a 20 2f 2a  e 0xf07700c6: /*
5090: 20 52 42 5f 50 4f 57 45 52 5f 4f 46 46 20 2a 2f   RB_POWER_OFF */
50a0: 0a 09 09 09 63 61 73 65 20 30 78 36 34 35 63 65  ....case 0x645ce
50b0: 31 63 36 3a 20 2f 2a 20 50 4f 57 45 52 5f 4f 46  1c6: /* POWER_OF
50c0: 46 20 2a 2f 0a 09 09 09 09 63 6d 64 20 3d 20 30  F */.....cmd = 0
50d0: 78 34 33 32 31 66 65 64 63 3b 0a 0a 09 09 09 09  x4321fedc;......
50e0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
50f0: 78 37 33 66 66 38 33 64 34 3a 20 2f 2a 20 4c 49  x73ff83d4: /* LI
5100: 4e 55 58 5f 52 45 42 4f 4f 54 5f 43 4d 44 5f 52  NUX_REBOOT_CMD_R
5110: 45 53 54 41 52 54 20 2a 2f 0a 09 09 09 63 61 73  ESTART */....cas
5120: 65 20 30 78 33 63 64 30 65 32 35 34 3a 20 2f 2a  e 0x3cd0e254: /*
5130: 20 52 42 5f 41 55 54 4f 42 4f 4f 54 20 2a 2f 0a   RB_AUTOBOOT */.
5140: 09 09 09 63 61 73 65 20 30 78 62 39 66 38 62 35  ...case 0xb9f8b5
5150: 64 34 3a 20 2f 2a 20 41 55 54 4f 42 4f 4f 54 20  d4: /* AUTOBOOT 
5160: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 33 61 33  */....case 0x3a3
5170: 35 37 66 64 34 3a 20 2f 2a 20 52 45 53 54 41 52  57fd4: /* RESTAR
5180: 54 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 35  T */....case 0x5
5190: 38 35 32 61 64 64 34 3a 20 2f 2a 20 52 45 42 4f  852add4: /* REBO
51a0: 4f 54 20 2a 2f 0a 09 09 09 09 63 6d 64 20 3d 20  OT */.....cmd = 
51b0: 52 42 5f 41 55 54 4f 42 4f 4f 54 3b 0a 0a 09 09  RB_AUTOBOOT;....
51c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
51d0: 75 6c 74 3a 0a 09 09 09 09 54 63 6c 5f 53 65 74  ult:.....Tcl_Set
51e0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
51f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5200: 62 6a 28 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 61  bj("unknown or a
5210: 6d 62 69 67 75 6f 75 73 20 73 75 62 63 6f 6d 6d  mbiguous subcomm
5220: 61 6e 64 3a 20 6d 75 73 74 20 62 65 20 44 49 53  and: must be DIS
5230: 41 42 4c 45 5f 43 41 44 2c 20 45 4e 41 42 4c 45  ABLE_CAD, ENABLE
5240: 5f 43 41 44 2c 20 48 41 4c 54 2c 20 50 4f 57 45  _CAD, HALT, POWE
5250: 52 5f 4f 46 46 2c 20 6f 72 20 52 45 53 54 41 52  R_OFF, or RESTAR
5260: 54 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72  T", -1));......r
5270: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
5280: 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 69 66  ;...}..} else if
5290: 20 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09   (objc == 1) {..
52a0: 09 63 6d 64 20 3d 20 52 42 5f 41 55 54 4f 42 4f  .cmd = RB_AUTOBO
52b0: 4f 54 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  OT;..} else {...
52c0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
52d0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
52e0: 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67  StringObj("wrong
52f0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
5300: 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79  be \"::tuapi::sy
5310: 73 63 61 6c 6c 3a 3a 72 65 62 6f 6f 74 20 3f 63  scall::reboot ?c
5320: 6f 6d 6d 61 6e 64 3f 22 2c 20 2d 31 29 29 3b 0a  ommand?", -1));.
5330: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
5340: 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
5350: 68 20 28 63 6d 64 29 20 7b 0a 09 09 63 61 73 65  h (cmd) {...case
5360: 20 52 42 5f 45 4e 41 42 4c 45 5f 43 41 44 3a 0a   RB_ENABLE_CAD:.
5370: 09 09 63 61 73 65 20 52 42 5f 44 49 53 41 42 4c  ..case RB_DISABL
5380: 45 5f 43 41 44 3a 0a 09 09 09 2f 2a 20 4e 6f 20  E_CAD:..../* No 
5390: 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 66 6f 72  need to sync for
53a0: 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
53b0: 73 20 2a 2f 0a 09 09 09 62 72 65 61 6b 3b 0a 09  s */....break;..
53c0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 73 79 6e  .default:....syn
53d0: 63 28 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  c();....break;..
53e0: 7d 0a 0a 09 72 65 62 6f 6f 74 5f 72 65 74 20 3d  }...reboot_ret =
53f0: 20 72 65 62 6f 6f 74 28 63 6d 64 29 3b 0a 09 69   reboot(cmd);..i
5400: 66 20 28 72 65 62 6f 6f 74 5f 72 65 74 20 21 3d  f (reboot_ret !=
5410: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f   0) {...Tcl_SetO
5420: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
5430: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5440: 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  j(strerror(errno
5450: 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75  ), -1));....retu
5460: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
5470: 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f  }...return(TCL_O
5480: 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  K);.}..static in
5490: 74 20 74 75 61 70 69 5f 65 6a 65 63 74 28 43 6c  t tuapi_eject(Cl
54a0: 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c  ientData cd, Tcl
54b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
54c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
54d0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
54e0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52  ) {..Tcl_SetObjR
54f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
5500: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
5510: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22  not implemented"
5520: 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e  , -1));...return
5530: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a  (TCL_ERROR);.}..
5540: 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69  static int tuapi
5550: 5f 70 73 28 43 6c 69 65 6e 74 44 61 74 61 20 63  _ps(ClientData c
5560: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
5570: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
5580: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
5590: 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f 53  objv[]) {..Tcl_S
55a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
55b0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
55c0: 67 4f 62 6a 28 22 6e 6f 74 20 69 6d 70 6c 65 6d  gObj("not implem
55d0: 65 6e 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09  ented", -1));...
55e0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
55f0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
5600: 20 74 75 61 70 69 5f 65 78 65 63 76 65 28 43 6c   tuapi_execve(Cl
5610: 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c  ientData cd, Tcl
5620: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
5630: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
5640: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
5650: 29 20 7b 0a 09 63 68 61 72 20 2a 2a 61 72 67 76  ) {..char **argv
5660: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
5670: 66 69 6c 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  file;..int idx;.
5680: 0a 09 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20  ..if (objc < 2) 
5690: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
56a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
56b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77  _NewStringObj("w
56c0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
56d0: 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70 69  uld be \"::tuapi
56e0: 3a 3a 73 79 73 63 61 6c 6c 3a 3a 65 78 65 63 76  ::syscall::execv
56f0: 65 20 66 69 6c 65 20 3f 61 72 67 73 20 2e 2e 2e  e file ?args ...
5700: 3f 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  ?\"", -1));....r
5710: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
5720: 3b 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6e 64 20 65  ;..}.../* Find e
5730: 78 65 63 75 74 61 62 6c 65 20 2a 2f 0a 09 66 69  xecutable */..fi
5740: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
5750: 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 09 2f  ng(objv[1]);.../
5760: 2a 20 47 65 6e 65 72 61 74 65 20 61 72 67 75 6d  * Generate argum
5770: 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 09 61 72  ent array */..ar
5780: 67 76 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  gv = malloc(size
5790: 6f 66 28 2a 61 72 67 76 29 20 2a 20 28 6f 62 6a  of(*argv) * (obj
57a0: 63 20 2d 20 31 29 29 3b 0a 0a 09 66 6f 72 20 28  c - 1));...for (
57b0: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f  idx = 2; idx < o
57c0: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  bjc; idx++) {...
57d0: 61 72 67 76 5b 69 64 78 20 2d 20 32 5d 20 3d 20  argv[idx - 2] = 
57e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
57f0: 6a 76 5b 69 64 78 5d 29 3b 0a 09 7d 0a 09 61 72  jv[idx]);..}..ar
5800: 67 76 5b 6f 62 6a 63 20 2d 20 32 5d 20 3d 20 4e  gv[objc - 2] = N
5810: 55 4c 4c 3b 0a 0a 09 2f 2a 20 50 61 73 73 20 65  ULL;.../* Pass e
5820: 78 65 63 75 74 69 6f 6e 20 74 6f 20 6e 65 77 20  xecution to new 
5830: 66 69 6c 65 20 2a 2f 0a 09 65 78 65 63 76 65 28  file */..execve(
5840: 66 69 6c 65 2c 20 61 72 67 76 2c 20 65 6e 76 69  file, argv, envi
5850: 72 6f 6e 29 3b 0a 0a 09 2f 2a 20 49 66 20 74 68  ron);.../* If th
5860: 65 20 6e 65 77 20 69 6d 61 67 65 20 63 6f 75 6c  e new image coul
5870: 64 20 6e 6f 74 20 74 61 6b 65 20 6f 76 65 72 2c  d not take over,
5880: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
5890: 77 72 6f 6e 67 20 2d 2d 20 72 65 70 6f 72 74 20  wrong -- report 
58a0: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 53 65  error */..Tcl_Se
58b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
58c0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
58d0: 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72  Obj(strerror(err
58e0: 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74  no), -1));...ret
58f0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
5900: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
5910: 61 70 69 5f 6c 6f 73 65 74 75 70 28 43 6c 69 65  api_losetup(Clie
5920: 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49  ntData cd, Tcl_I
5930: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
5940: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
5950: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20   *CONST objv[]) 
5960: 7b 0a 09 63 68 61 72 20 2a 66 69 6c 65 2c 20 2a  {..char *file, *
5970: 6c 6f 6f 70 64 65 76 3b 0a 09 69 6e 74 20 63 68  loopdev;..int ch
5980: 6b 5f 72 65 74 3b 0a 09 69 6e 74 20 6c 6f 6f 70  k_ret;..int loop
5990: 66 64 2c 20 66 69 6c 65 66 64 3b 0a 0a 09 69 66  fd, filefd;...if
59a0: 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09   (objc != 3) {..
59b0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
59c0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
59d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e  wStringObj("wron
59e0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
59f0: 20 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73   be \"::tuapi::s
5a00: 79 73 63 61 6c 6c 3a 3a 6c 6f 73 65 74 75 70 20  yscall::losetup 
5a10: 6c 6f 6f 70 64 65 76 20 66 69 6c 65 5c 22 22 2c  loopdev file\"",
5a20: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
5a30: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
5a40: 0a 09 6c 6f 6f 70 64 65 76 20 3d 20 54 63 6c 5f  ..loopdev = Tcl_
5a50: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
5a60: 5d 29 3b 0a 09 66 69 6c 65 20 3d 20 54 63 6c 5f  ]);..file = Tcl_
5a70: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
5a80: 5d 29 3b 0a 0a 09 6c 6f 6f 70 66 64 20 3d 20 6f  ]);...loopfd = o
5a90: 70 65 6e 28 6c 6f 6f 70 64 65 76 2c 20 4f 5f 52  pen(loopdev, O_R
5aa0: 44 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 6c 6f 6f  DONLY);..if (loo
5ab0: 70 66 64 20 3c 20 30 29 20 7b 0a 09 09 54 63 6c  pfd < 0) {...Tcl
5ac0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
5ad0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
5ae0: 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28  ingObj(strerror(
5af0: 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09  errno), -1));...
5b00: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
5b10: 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 69 6c  R);..}...if (fil
5b20: 65 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a  e[0] != '\0') {.
5b30: 09 09 66 69 6c 65 66 64 20 3d 20 6f 70 65 6e 28  ..filefd = open(
5b40: 66 69 6c 65 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  file, O_RDONLY);
5b50: 0a 09 09 69 66 20 28 66 69 6c 65 66 64 20 3c 20  ...if (filefd < 
5b60: 30 29 20 7b 0a 09 09 09 63 6c 6f 73 65 28 6c 6f  0) {....close(lo
5b70: 6f 70 66 64 29 3b 0a 0a 09 09 09 54 63 6c 5f 53  opfd);.....Tcl_S
5b80: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
5b90: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
5ba0: 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72  gObj(strerror(er
5bb0: 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  rno), -1));.....
5bc0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
5bd0: 29 3b 0a 09 09 7d 0a 0a 09 09 63 68 6b 5f 72 65  );...}....chk_re
5be0: 74 20 3d 20 69 6f 63 74 6c 28 6c 6f 6f 70 66 64  t = ioctl(loopfd
5bf0: 2c 20 4c 4f 4f 50 5f 53 45 54 5f 46 44 2c 20 66  , LOOP_SET_FD, f
5c00: 69 6c 65 66 64 29 3b 0a 0a 09 09 63 6c 6f 73 65  ilefd);....close
5c10: 28 66 69 6c 65 66 64 29 3b 0a 09 7d 20 65 6c 73  (filefd);..} els
5c20: 65 20 7b 0a 09 09 63 68 6b 5f 72 65 74 20 3d 20  e {...chk_ret = 
5c30: 69 6f 63 74 6c 28 6c 6f 6f 70 66 64 2c 20 4c 4f  ioctl(loopfd, LO
5c40: 4f 50 5f 43 4c 52 5f 46 44 2c 20 30 29 3b 0a 09  OP_CLR_FD, 0);..
5c50: 7d 0a 0a 09 63 6c 6f 73 65 28 6c 6f 6f 70 66 64  }...close(loopfd
5c60: 29 3b 0a 0a 09 69 66 20 28 63 68 6b 5f 72 65 74  );...if (chk_ret
5c70: 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53   != 0) {...Tcl_S
5c80: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
5c90: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
5ca0: 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72  gObj(strerror(er
5cb0: 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  rno), -1));....r
5cc0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
5cd0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43  ;..}...return(TC
5ce0: 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  L_OK);.}..static
5cf0: 20 76 6f 69 64 20 74 75 61 70 69 5f 70 72 69 76   void tuapi_priv
5d00: 61 74 65 5f 61 70 70 65 6e 64 5f 73 6f 63 6b 61  ate_append_socka
5d10: 64 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a 28 54 63  ddr_to_tclobj(Tc
5d20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5d30: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 2c  , Tcl_Obj *list,
5d40: 20 63 68 61 72 20 2a 68 65 61 64 65 72 2c 20 73   char *header, s
5d50: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
5d60: 61 64 64 72 29 20 7b 0a 09 63 68 61 72 20 61 64  addr) {..char ad
5d70: 64 72 5f 62 75 66 5b 49 4e 45 54 36 5f 41 44 44  dr_buf[INET6_ADD
5d80: 52 53 54 52 4c 45 4e 20 2b 20 49 4e 45 54 5f 41  RSTRLEN + INET_A
5d90: 44 44 52 53 54 52 4c 45 4e 20 2b 20 31 5d 2c 20  DDRSTRLEN + 1], 
5da0: 2a 63 68 6b 5f 69 6e 70 3b 0a 0a 09 73 77 69 74  *chk_inp;...swit
5db0: 63 68 20 28 61 64 64 72 2d 3e 73 61 5f 66 61 6d  ch (addr->sa_fam
5dc0: 69 6c 79 29 20 7b 0a 09 09 63 61 73 65 20 41 46  ily) {...case AF
5dd0: 5f 49 4e 45 54 3a 20 2f 2a 20 49 50 76 34 20 2a  _INET: /* IPv4 *
5de0: 2f 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54  /...case AF_INET
5df0: 36 3a 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 09 09  6: /* IPv6 */...
5e00: 09 73 77 69 74 63 68 20 28 61 64 64 72 2d 3e 73  .switch (addr->s
5e10: 61 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 09 09  a_family) {.....
5e20: 63 61 73 65 20 41 46 5f 49 4e 45 54 3a 20 2f 2a  case AF_INET: /*
5e30: 20 49 50 76 34 20 2a 2f 0a 09 09 09 09 09 63 68   IPv4 */......ch
5e40: 6b 5f 69 6e 70 20 3d 20 28 63 68 61 72 20 2a 29  k_inp = (char *)
5e50: 20 69 6e 65 74 5f 6e 74 6f 70 28 61 64 64 72 2d   inet_ntop(addr-
5e60: 3e 73 61 5f 66 61 6d 69 6c 79 2c 20 26 28 28 73  >sa_family, &((s
5e70: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
5e80: 6e 20 2a 29 20 61 64 64 72 29 2d 3e 73 69 6e 5f  n *) addr)->sin_
5e90: 61 64 64 72 2c 20 61 64 64 72 5f 62 75 66 2c 20  addr, addr_buf, 
5ea0: 73 69 7a 65 6f 66 28 61 64 64 72 5f 62 75 66 29  sizeof(addr_buf)
5eb0: 29 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
5ec0: 09 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36  ...case AF_INET6
5ed0: 3a 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 09 09 09  : /* IPv6 */....
5ee0: 09 09 63 68 6b 5f 69 6e 70 20 3d 20 28 63 68 61  ..chk_inp = (cha
5ef0: 72 20 2a 29 20 69 6e 65 74 5f 6e 74 6f 70 28 61  r *) inet_ntop(a
5f00: 64 64 72 2d 3e 73 61 5f 66 61 6d 69 6c 79 2c 20  ddr->sa_family, 
5f10: 26 28 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64  &((struct sockad
5f20: 64 72 5f 69 6e 36 20 2a 29 20 61 64 64 72 29 2d  dr_in6 *) addr)-
5f30: 3e 73 69 6e 36 5f 61 64 64 72 2c 20 61 64 64 72  >sin6_addr, addr
5f40: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 64 64  _buf, sizeof(add
5f50: 72 5f 62 75 66 29 29 3b 0a 09 09 09 09 09 62 72  r_buf));......br
5f60: 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  eak;....}.....if
5f70: 20 28 63 68 6b 5f 69 6e 70 20 3d 3d 20 4e 55 4c   (chk_inp == NUL
5f80: 4c 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  L) {.....break;.
5f90: 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 68 65 61  ...}.....if (hea
5fa0: 64 65 72 29 20 7b 0a 09 09 09 09 54 63 6c 5f 4c  der) {.....Tcl_L
5fb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5fc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
5fd0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5fe0: 62 6a 28 68 65 61 64 65 72 2c 20 2d 31 29 29 3b  bj(header, -1));
5ff0: 0a 09 09 09 7d 0a 0a 09 09 09 54 63 6c 5f 4c 69  ....}.....Tcl_Li
6000: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6010: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 2c  nt(interp, list,
6020: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6030: 6a 28 61 64 64 72 5f 62 75 66 2c 20 2d 31 29 29  j(addr_buf, -1))
6040: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  ;.....break;..}.
6050: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
6060: 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 70 72  tic int tuapi_pr
6070: 69 76 61 74 65 5f 67 65 74 5f 73 6f 63 6b 61 64  ivate_get_sockad
6080: 64 72 5f 66 72 6f 6d 5f 6f 62 6a 28 54 63 6c 5f  dr_from_obj(Tcl_
6090: 4f 62 6a 20 2a 76 61 6c 75 65 2c 20 76 6f 69 64  Obj *value, void
60a0: 20 2a 74 61 72 67 65 74 29 20 7b 0a 09 73 74 72   *target) {..str
60b0: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20  uct sockaddr_in 
60c0: 6c 6f 63 61 6c 5f 76 34 3b 0a 09 73 74 72 75 63  local_v4;..struc
60d0: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 6c  t sockaddr_in6 l
60e0: 6f 63 61 6c 5f 76 36 3b 0a 09 63 6f 6e 73 74 20  ocal_v6;..const 
60f0: 63 68 61 72 20 2a 61 64 64 72 5f 73 74 72 3b 0a  char *addr_str;.
6100: 09 69 6e 74 20 69 6e 65 74 70 74 6f 6e 5f 72 65  .int inetpton_re
6110: 74 3b 0a 0a 09 61 64 64 72 5f 73 74 72 20 3d 20  t;...addr_str = 
6120: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 76 61  Tcl_GetString(va
6130: 6c 75 65 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 26  lue);...memset(&
6140: 6c 6f 63 61 6c 5f 76 34 2c 20 30 2c 20 73 69 7a  local_v4, 0, siz
6150: 65 6f 66 28 6c 6f 63 61 6c 5f 76 34 29 29 3b 0a  eof(local_v4));.
6160: 09 69 6e 65 74 70 74 6f 6e 5f 72 65 74 20 3d 20  .inetpton_ret = 
6170: 69 6e 65 74 5f 70 74 6f 6e 28 41 46 5f 49 4e 45  inet_pton(AF_INE
6180: 54 2c 20 61 64 64 72 5f 73 74 72 2c 20 26 6c 6f  T, addr_str, &lo
6190: 63 61 6c 5f 76 34 2e 73 69 6e 5f 61 64 64 72 29  cal_v4.sin_addr)
61a0: 3b 0a 09 69 66 20 28 69 6e 65 74 70 74 6f 6e 5f  ;..if (inetpton_
61b0: 72 65 74 20 3d 3d 20 31 29 20 7b 0a 09 09 6c 6f  ret == 1) {...lo
61c0: 63 61 6c 5f 76 34 2e 73 69 6e 5f 66 61 6d 69 6c  cal_v4.sin_famil
61d0: 79 20 3d 20 41 46 5f 49 4e 45 54 3b 0a 0a 09 09  y = AF_INET;....
61e0: 6d 65 6d 63 70 79 28 74 61 72 67 65 74 2c 20 26  memcpy(target, &
61f0: 6c 6f 63 61 6c 5f 76 34 2c 20 73 69 7a 65 6f 66  local_v4, sizeof
6200: 28 6c 6f 63 61 6c 5f 76 34 29 29 3b 0a 0a 09 09  (local_v4));....
6210: 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
6220: 6d 65 6d 73 65 74 28 26 6c 6f 63 61 6c 5f 76 36  memset(&local_v6
6230: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 61  , 0, sizeof(loca
6240: 6c 5f 76 36 29 29 3b 0a 09 69 6e 65 74 70 74 6f  l_v6));..inetpto
6250: 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f  n_ret = inet_pto
6260: 6e 28 41 46 5f 49 4e 45 54 36 2c 20 61 64 64 72  n(AF_INET6, addr
6270: 5f 73 74 72 2c 20 26 6c 6f 63 61 6c 5f 76 36 2e  _str, &local_v6.
6280: 73 69 6e 36 5f 61 64 64 72 29 3b 0a 09 69 66 20  sin6_addr);..if 
6290: 28 69 6e 65 74 70 74 6f 6e 5f 72 65 74 20 3d 3d  (inetpton_ret ==
62a0: 20 31 29 20 7b 0a 09 09 6c 6f 63 61 6c 5f 76 36   1) {...local_v6
62b0: 2e 73 69 6e 36 5f 66 61 6d 69 6c 79 20 3d 20 41  .sin6_family = A
62c0: 46 5f 49 4e 45 54 36 3b 0a 0a 09 09 6d 65 6d 63  F_INET6;....memc
62d0: 70 79 28 74 61 72 67 65 74 2c 20 26 6c 6f 63 61  py(target, &loca
62e0: 6c 5f 76 36 2c 20 73 69 7a 65 6f 66 28 6c 6f 63  l_v6, sizeof(loc
62f0: 61 6c 5f 76 36 29 29 3b 0a 0a 09 09 72 65 74 75  al_v6));....retu
6300: 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  rn(0);..}...retu
6310: 72 6e 28 2d 31 29 3b 0a 7d 0a 0a 73 74 61 74 69  rn(-1);.}..stati
6320: 63 20 69 6e 74 20 74 75 61 70 69 5f 69 66 63 6f  c int tuapi_ifco
6330: 6e 66 69 67 5f 6c 69 73 74 28 43 6c 69 65 6e 74  nfig_list(Client
6340: 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74  Data cd, Tcl_Int
6350: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
6360: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
6370: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e  CONST objv[], in
6380: 74 20 73 6f 63 6b 29 20 7b 0a 09 54 63 6c 5f 4f  t sock) {..Tcl_O
6390: 62 6a 20 2a 74 63 6c 5f 69 66 61 63 65 5f 6c 69  bj *tcl_iface_li
63a0: 73 74 3b 0a 09 73 74 72 75 63 74 20 69 66 63 6f  st;..struct ifco
63b0: 6e 66 20 69 66 61 63 65 73 5f 63 66 67 3b 0a 09  nf ifaces_cfg;..
63c0: 73 74 72 75 63 74 20 69 66 72 65 71 20 2a 69 66  struct ifreq *if
63d0: 61 63 65 5f 72 65 71 20 3d 20 4e 55 4c 4c 3b 0a  ace_req = NULL;.
63e0: 09 69 6e 74 20 69 66 61 63 65 5f 72 65 71 5f 63  .int iface_req_c
63f0: 6e 74 20 3d 20 32 32 34 2c 20 69 66 61 63 65 5f  nt = 224, iface_
6400: 72 65 71 5f 6c 65 6e 3b 0a 09 69 6e 74 20 69 64  req_len;..int id
6410: 78 2c 20 69 66 61 63 65 5f 63 6e 74 3b 0a 09 69  x, iface_cnt;..i
6420: 6e 74 20 69 6f 63 74 6c 5f 72 65 74 2c 20 74 63  nt ioctl_ret, tc
6430: 6c 5f 72 65 74 3b 0a 0a 09 69 66 61 63 65 5f 72  l_ret;...iface_r
6440: 65 71 5f 6c 65 6e 20 3d 20 69 66 61 63 65 5f 72  eq_len = iface_r
6450: 65 71 5f 63 6e 74 20 2a 20 73 69 7a 65 6f 66 28  eq_cnt * sizeof(
6460: 2a 69 66 61 63 65 5f 72 65 71 29 3b 0a 09 69 66  *iface_req);..if
6470: 61 63 65 5f 72 65 71 20 3d 20 6d 61 6c 6c 6f 63  ace_req = malloc
6480: 28 69 66 61 63 65 5f 72 65 71 5f 6c 65 6e 29 3b  (iface_req_len);
6490: 0a 09 69 66 20 28 69 66 61 63 65 5f 72 65 71 20  ..if (iface_req 
64a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  == NULL) {.../* 
64b0: 52 65 70 6f 72 74 20 66 61 69 6c 75 72 65 20 2a  Report failure *
64c0: 2f 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  /...Tcl_SetObjRe
64d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
64e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75  _NewStringObj("u
64f0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
6500: 65 20 6d 65 6d 6f 72 79 22 2c 20 2d 31 29 29 3b  e memory", -1));
6510: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
6520: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 61 63  RROR);..}...ifac
6530: 65 73 5f 63 66 67 2e 69 66 63 5f 72 65 71 20 3d  es_cfg.ifc_req =
6540: 20 69 66 61 63 65 5f 72 65 71 3b 0a 09 69 66 61   iface_req;..ifa
6550: 63 65 73 5f 63 66 67 2e 69 66 63 5f 6c 65 6e 20  ces_cfg.ifc_len 
6560: 3d 20 69 66 61 63 65 5f 72 65 71 5f 6c 65 6e 3b  = iface_req_len;
6570: 0a 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f  ..ioctl_ret = io
6580: 63 74 6c 28 73 6f 63 6b 2c 20 53 49 4f 43 47 49  ctl(sock, SIOCGI
6590: 46 43 4f 4e 46 2c 20 26 69 66 61 63 65 73 5f 63  FCONF, &ifaces_c
65a0: 66 67 29 3b 0a 09 69 66 20 28 69 6f 63 74 6c 5f  fg);..if (ioctl_
65b0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63  ret != 0) {...Tc
65c0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
65d0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
65e0: 72 69 6e 67 4f 62 6a 28 22 69 6f 63 74 6c 20 66  ringObj("ioctl f
65f0: 61 69 6c 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09  ailed", -1));...
6600: 09 66 72 65 65 28 69 66 61 63 65 5f 72 65 71 29  .free(iface_req)
6610: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  ;....return(TCL_
6620: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 61  ERROR);..}...ifa
6630: 63 65 5f 63 6e 74 20 3d 20 69 66 61 63 65 73 5f  ce_cnt = ifaces_
6640: 63 66 67 2e 69 66 63 5f 6c 65 6e 20 2f 20 73 69  cfg.ifc_len / si
6650: 7a 65 6f 66 28 2a 69 66 61 63 65 5f 72 65 71 29  zeof(*iface_req)
6660: 3b 0a 0a 09 74 63 6c 5f 69 66 61 63 65 5f 6c 69  ;...tcl_iface_li
6670: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
6680: 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  );...for (idx = 
6690: 30 3b 20 69 64 78 20 3c 20 69 66 61 63 65 5f 63  0; idx < iface_c
66a0: 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 74  nt; idx++) {...t
66b0: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 4c 69 73  cl_ret = Tcl_Lis
66c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
66d0: 74 28 69 6e 74 65 72 70 2c 20 74 63 6c 5f 69 66  t(interp, tcl_if
66e0: 61 63 65 5f 6c 69 73 74 2c 20 54 63 6c 5f 4e 65  ace_list, Tcl_Ne
66f0: 77 53 74 72 69 6e 67 4f 62 6a 28 69 66 61 63 65  wStringObj(iface
6700: 5f 72 65 71 5b 69 64 78 5d 2e 69 66 72 5f 6e 61  _req[idx].ifr_na
6710: 6d 65 2c 20 2d 31 29 29 3b 0a 09 09 69 66 20 28  me, -1));...if (
6720: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
6730: 4b 29 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 4f  K) {....Tcl_SetO
6740: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
6750: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6760: 6a 28 22 75 6e 61 62 6c 65 20 74 6f 20 61 70 70  j("unable to app
6770: 65 6e 64 20 74 6f 20 6c 69 73 74 22 2c 20 2d 31  end to list", -1
6780: 29 29 3b 0a 0a 09 09 09 66 72 65 65 28 69 66 61  ));.....free(ifa
6790: 63 65 5f 72 65 71 29 3b 0a 0a 09 09 09 72 65 74  ce_req);.....ret
67a0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
67b0: 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 66  ..}..}...free(if
67c0: 61 63 65 5f 72 65 71 29 3b 0a 0a 09 54 63 6c 5f  ace_req);...Tcl_
67d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
67e0: 65 72 70 2c 20 74 63 6c 5f 69 66 61 63 65 5f 6c  erp, tcl_iface_l
67f0: 69 73 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54  ist);...return(T
6800: 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69  CL_OK);.}..stati
6810: 63 20 69 6e 74 20 74 75 61 70 69 5f 69 66 63 6f  c int tuapi_ifco
6820: 6e 66 69 67 5f 69 6e 66 6f 28 43 6c 69 65 6e 74  nfig_info(Client
6830: 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74  Data cd, Tcl_Int
6840: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
6850: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
6860: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e  CONST objv[], in
6870: 74 20 73 6f 63 6b 2c 20 69 6e 74 20 73 6f 63 6b  t sock, int sock
6880: 5f 76 34 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 36  _v4, int sock_v6
6890: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65  ) {..Tcl_Obj *re
68a0: 74 6c 69 73 74 2c 20 2a 66 6c 61 67 73 3b 0a 09  tlist, *flags;..
68b0: 73 74 72 75 63 74 20 69 66 72 65 71 20 69 66 61  struct ifreq ifa
68c0: 63 65 5f 72 65 71 3b 0a 09 75 6e 73 69 67 6e 65  ce_req;..unsigne
68d0: 64 20 63 68 61 72 20 2a 61 64 64 72 5f 64 61 74  d char *addr_dat
68e0: 61 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  a;..const char *
68f0: 6c 69 6e 6b 5f 65 6e 63 61 70 3b 0a 09 63 6f 6e  link_encap;..con
6900: 73 74 20 63 68 61 72 20 2a 69 66 61 63 65 3b 0a  st char *iface;.
6910: 09 69 6e 74 20 66 6c 61 67 73 5f 62 69 74 6d 61  .int flags_bitma
6920: 73 6b 2c 20 66 6c 61 67 5f 62 72 6f 61 64 63 61  sk, flag_broadca
6930: 73 74 20 3d 20 30 2c 20 66 6c 61 67 5f 70 6f 69  st = 0, flag_poi
6940: 6e 74 6f 70 6f 69 6e 74 20 3d 20 30 3b 0a 09 69  ntopoint = 0;..i
6950: 6e 74 20 69 6f 63 74 6c 5f 72 65 74 3b 0a 0a 09  nt ioctl_ret;...
6960: 72 65 74 6c 69 73 74 20 3d 20 54 63 6c 5f 4e 65  retlist = Tcl_Ne
6970: 77 4f 62 6a 28 29 3b 0a 0a 09 69 66 61 63 65 20  wObj();...iface 
6980: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
6990: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 09 69 66 20 28  objv[1]);...if (
69a0: 28 73 74 72 6c 65 6e 28 69 66 61 63 65 29 20 2b  (strlen(iface) +
69b0: 20 31 29 20 3e 3d 20 49 46 4e 41 4d 53 49 5a 29   1) >= IFNAMSIZ)
69c0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
69d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
69e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
69f0: 69 6e 74 65 72 66 61 63 65 20 6e 61 6d 65 20 74  interface name t
6a00: 6f 6f 20 6c 6f 6e 67 22 2c 20 2d 31 29 29 3b 0a  oo long", -1));.
6a10: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
6a20: 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 74 72 63 70  ROR);..}...strcp
6a30: 79 28 69 66 61 63 65 5f 72 65 71 2e 69 66 72 5f  y(iface_req.ifr_
6a40: 6e 61 6d 65 2c 20 69 66 61 63 65 29 3b 0a 0a 09  name, iface);...
6a50: 2f 2a 0a 09 20 2a 20 41 6c 6c 20 69 6e 74 65 72  /*.. * All inter
6a60: 66 61 63 65 73 20 73 68 6f 75 6c 64 20 68 61 76  faces should hav
6a70: 65 20 66 6c 61 67 73 2c 20 73 6f 20 75 73 65 20  e flags, so use 
6a80: 69 74 20 61 73 20 61 20 63 68 65 63 6b 20 66 6f  it as a check fo
6a90: 72 20 69 6e 74 65 72 66 61 63 65 0a 09 20 2a 20  r interface.. * 
6aa0: 65 78 69 73 74 61 6e 63 65 0a 09 20 2a 2f 0a 09  existance.. */..
6ab0: 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74  ioctl_ret = ioct
6ac0: 6c 28 73 6f 63 6b 2c 20 53 49 4f 43 47 49 46 46  l(sock, SIOCGIFF
6ad0: 4c 41 47 53 2c 20 26 69 66 61 63 65 5f 72 65 71  LAGS, &iface_req
6ae0: 29 3b 0a 09 69 66 20 28 69 6f 63 74 6c 5f 72 65  );..if (ioctl_re
6af0: 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  t != 0) {...Tcl_
6b00: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
6b10: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
6b20: 6e 67 4f 62 6a 28 22 69 6e 76 61 6c 69 64 20 69  ngObj("invalid i
6b30: 6e 74 65 72 66 61 63 65 22 2c 20 2d 31 29 29 3b  nterface", -1));
6b40: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
6b50: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  RROR);..}.../* C
6b60: 72 65 61 74 65 20 6c 69 73 74 20 6f 66 20 66 6c  reate list of fl
6b70: 61 67 73 20 2a 2f 0a 09 66 6c 61 67 73 20 3d 20  ags */..flags = 
6b80: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 66  Tcl_NewObj();..f
6b90: 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 3d 20 69  lags_bitmask = i
6ba0: 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 66 6c 61  face_req.ifr_fla
6bb0: 67 73 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73  gs;...if ((flags
6bc0: 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 55  _bitmask & IFF_U
6bd0: 50 29 20 3d 3d 20 49 46 46 5f 55 50 29 20 7b 0a  P) == IFF_UP) {.
6be0: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
6bf0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6c00: 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65  p, flags, Tcl_Ne
6c10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 50 22 2c  wStringObj("UP",
6c20: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28   -1));..}..if ((
6c30: 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20  flags_bitmask & 
6c40: 49 46 46 5f 42 52 4f 41 44 43 41 53 54 29 20 3d  IFF_BROADCAST) =
6c50: 3d 20 49 46 46 5f 42 52 4f 41 44 43 41 53 54 29  = IFF_BROADCAST)
6c60: 20 7b 0a 09 09 66 6c 61 67 5f 62 72 6f 61 64 63   {...flag_broadc
6c70: 61 73 74 20 3d 20 31 3b 0a 0a 09 09 54 63 6c 5f  ast = 1;....Tcl_
6c80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6c90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61  ment(interp, fla
6ca0: 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  gs, Tcl_NewStrin
6cb0: 67 4f 62 6a 28 22 42 52 4f 41 44 43 41 53 54 22  gObj("BROADCAST"
6cc0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
6cd0: 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26  (flags_bitmask &
6ce0: 20 49 46 46 5f 50 4f 49 4e 54 4f 50 4f 49 4e 54   IFF_POINTOPOINT
6cf0: 29 20 3d 3d 20 49 46 46 5f 50 4f 49 4e 54 4f 50  ) == IFF_POINTOP
6d00: 4f 49 4e 54 29 20 7b 0a 09 09 66 6c 61 67 5f 70  OINT) {...flag_p
6d10: 6f 69 6e 74 6f 70 6f 69 6e 74 20 3d 20 31 3b 0a  ointopoint = 1;.
6d20: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
6d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6d40: 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e  rp, flags, Tcl_N
6d50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 50 4f 49  ewStringObj("POI
6d60: 4e 54 4f 50 4f 49 4e 54 22 2c 20 2d 31 29 29 3b  NTOPOINT", -1));
6d70: 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f  ..}..if ((flags_
6d80: 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 44 45  bitmask & IFF_DE
6d90: 42 55 47 29 20 3d 3d 20 49 46 46 5f 44 45 42 55  BUG) == IFF_DEBU
6da0: 47 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  G) {...Tcl_ListO
6db0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6dc0: 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54  interp, flags, T
6dd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6de0: 22 44 45 42 55 47 22 2c 20 2d 31 29 29 3b 0a 09  "DEBUG", -1));..
6df0: 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69  }..if ((flags_bi
6e00: 74 6d 61 73 6b 20 26 20 49 46 46 5f 4c 4f 4f 50  tmask & IFF_LOOP
6e10: 42 41 43 4b 29 20 3d 3d 20 49 46 46 5f 4c 4f 4f  BACK) == IFF_LOO
6e20: 50 42 41 43 4b 29 20 7b 0a 09 09 54 63 6c 5f 4c  PBACK) {...Tcl_L
6e30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6e40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67  ent(interp, flag
6e50: 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  s, Tcl_NewString
6e60: 4f 62 6a 28 22 4c 4f 4f 50 42 41 43 4b 22 2c 20  Obj("LOOPBACK", 
6e70: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66  -1));..}..if ((f
6e80: 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49  lags_bitmask & I
6e90: 46 46 5f 4e 4f 54 52 41 49 4c 45 52 53 29 20 3d  FF_NOTRAILERS) =
6ea0: 3d 20 49 46 46 5f 4e 4f 54 52 41 49 4c 45 52 53  = IFF_NOTRAILERS
6eb0: 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62  ) {...Tcl_ListOb
6ec0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6ed0: 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63  nterp, flags, Tc
6ee0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6ef0: 4e 4f 54 52 41 49 4c 45 52 53 22 2c 20 2d 31 29  NOTRAILERS", -1)
6f00: 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67  );..}..if ((flag
6f10: 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f  s_bitmask & IFF_
6f20: 52 55 4e 4e 49 4e 47 29 20 3d 3d 20 49 46 46 5f  RUNNING) == IFF_
6f30: 52 55 4e 4e 49 4e 47 29 20 7b 0a 09 09 54 63 6c  RUNNING) {...Tcl
6f40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6f50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c  ement(interp, fl
6f60: 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ags, Tcl_NewStri
6f70: 6e 67 4f 62 6a 28 22 52 55 4e 4e 49 4e 47 22 2c  ngObj("RUNNING",
6f80: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28   -1));..}..if ((
6f90: 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20  flags_bitmask & 
6fa0: 49 46 46 5f 4e 4f 41 52 50 29 20 3d 3d 20 49 46  IFF_NOARP) == IF
6fb0: 46 5f 4e 4f 41 52 50 29 20 7b 0a 09 09 54 63 6c  F_NOARP) {...Tcl
6fc0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6fd0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c  ement(interp, fl
6fe0: 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ags, Tcl_NewStri
6ff0: 6e 67 4f 62 6a 28 22 4e 4f 41 52 50 22 2c 20 2d  ngObj("NOARP", -
7000: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c  1));..}..if ((fl
7010: 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49 46  ags_bitmask & IF
7020: 46 5f 50 52 4f 4d 49 53 43 29 20 3d 3d 20 49 46  F_PROMISC) == IF
7030: 46 5f 50 52 4f 4d 49 53 43 29 20 7b 0a 09 09 54  F_PROMISC) {...T
7040: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7050: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
7060: 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74  flags, Tcl_NewSt
7070: 72 69 6e 67 4f 62 6a 28 22 50 52 4f 4d 49 53 43  ringObj("PROMISC
7080: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
7090: 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20  ((flags_bitmask 
70a0: 26 20 49 46 46 5f 41 4c 4c 4d 55 4c 54 49 29 20  & IFF_ALLMULTI) 
70b0: 3d 3d 20 49 46 46 5f 41 4c 4c 4d 55 4c 54 49 29  == IFF_ALLMULTI)
70c0: 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   {...Tcl_ListObj
70d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
70e0: 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c  terp, flags, Tcl
70f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 41  _NewStringObj("A
7100: 4c 4c 4d 55 4c 54 49 22 2c 20 2d 31 29 29 3b 0a  LLMULTI", -1));.
7110: 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62  .}..if ((flags_b
7120: 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 4d 41 53  itmask & IFF_MAS
7130: 54 45 52 29 20 3d 3d 20 49 46 46 5f 4d 41 53 54  TER) == IFF_MAST
7140: 45 52 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74  ER) {...Tcl_List
7150: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
7160: 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20  (interp, flags, 
7170: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7180: 28 22 4d 41 53 54 45 52 22 2c 20 2d 31 29 29 3b  ("MASTER", -1));
7190: 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f  ..}..if ((flags_
71a0: 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 53 4c  bitmask & IFF_SL
71b0: 41 56 45 29 20 3d 3d 20 49 46 46 5f 53 4c 41 56  AVE) == IFF_SLAV
71c0: 45 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  E) {...Tcl_ListO
71d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
71e0: 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54  interp, flags, T
71f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7200: 22 53 4c 41 56 45 22 2c 20 2d 31 29 29 3b 0a 09  "SLAVE", -1));..
7210: 7d 0a 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69  }..if ((flags_bi
7220: 74 6d 61 73 6b 20 26 20 49 46 46 5f 4d 55 4c 54  tmask & IFF_MULT
7230: 49 43 41 53 54 29 20 3d 3d 20 49 46 46 5f 4d 55  ICAST) == IFF_MU
7240: 4c 54 49 43 41 53 54 29 20 7b 0a 09 09 54 63 6c  LTICAST) {...Tcl
7250: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7260: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c  ement(interp, fl
7270: 61 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ags, Tcl_NewStri
7280: 6e 67 4f 62 6a 28 22 4d 55 4c 54 49 43 41 53 54  ngObj("MULTICAST
7290: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
72a0: 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20  ((flags_bitmask 
72b0: 26 20 49 46 46 5f 50 4f 52 54 53 45 4c 29 20 3d  & IFF_PORTSEL) =
72c0: 3d 20 49 46 46 5f 50 4f 52 54 53 45 4c 29 20 7b  = IFF_PORTSEL) {
72d0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
72e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
72f0: 72 70 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e  rp, flags, Tcl_N
7300: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 50 4f 52  ewStringObj("POR
7310: 54 53 45 4c 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  TSEL", -1));..}.
7320: 09 69 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d  .if ((flags_bitm
7330: 61 73 6b 20 26 20 49 46 46 5f 41 55 54 4f 4d 45  ask & IFF_AUTOME
7340: 44 49 41 29 20 3d 3d 20 49 46 46 5f 41 55 54 4f  DIA) == IFF_AUTO
7350: 4d 45 44 49 41 29 20 7b 0a 09 09 54 63 6c 5f 4c  MEDIA) {...Tcl_L
7360: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7370: 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67  ent(interp, flag
7380: 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  s, Tcl_NewString
7390: 4f 62 6a 28 22 41 55 54 4f 4d 45 44 49 41 22 2c  Obj("AUTOMEDIA",
73a0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 28   -1));..}..if ((
73b0: 66 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20  flags_bitmask & 
73c0: 49 46 46 5f 44 59 4e 41 4d 49 43 29 20 3d 3d 20  IFF_DYNAMIC) == 
73d0: 49 46 46 5f 44 59 4e 41 4d 49 43 29 20 7b 0a 09  IFF_DYNAMIC) {..
73e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
73f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7400: 2c 20 66 6c 61 67 73 2c 20 54 63 6c 5f 4e 65 77  , flags, Tcl_New
7410: 53 74 72 69 6e 67 4f 62 6a 28 22 44 59 4e 41 4d  StringObj("DYNAM
7420: 49 43 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  IC", -1));..}..i
7430: 66 20 28 28 66 6c 61 67 73 5f 62 69 74 6d 61 73  f ((flags_bitmas
7440: 6b 20 26 20 49 46 46 5f 4c 4f 57 45 52 5f 55 50  k & IFF_LOWER_UP
7450: 29 20 3d 3d 20 49 46 46 5f 4c 4f 57 45 52 5f 55  ) == IFF_LOWER_U
7460: 50 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  P) {...Tcl_ListO
7470: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7480: 69 6e 74 65 72 70 2c 20 66 6c 61 67 73 2c 20 54  interp, flags, T
7490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
74a0: 22 4c 4f 57 45 52 5f 55 50 22 2c 20 2d 31 29 29  "LOWER_UP", -1))
74b0: 3b 0a 09 7d 0a 09 69 66 20 28 28 66 6c 61 67 73  ;..}..if ((flags
74c0: 5f 62 69 74 6d 61 73 6b 20 26 20 49 46 46 5f 44  _bitmask & IFF_D
74d0: 4f 52 4d 41 4e 54 29 20 3d 3d 20 49 46 46 5f 44  ORMANT) == IFF_D
74e0: 4f 52 4d 41 4e 54 29 20 7b 0a 09 09 54 63 6c 5f  ORMANT) {...Tcl_
74f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7500: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61  ment(interp, fla
7510: 67 73 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  gs, Tcl_NewStrin
7520: 67 4f 62 6a 28 22 44 4f 52 4d 41 4e 54 22 2c 20  gObj("DORMANT", 
7530: 2d 31 29 29 3b 0a 09 7d 0a 23 69 66 64 65 66 20  -1));..}.#ifdef 
7540: 49 46 46 5f 45 43 48 4f 0a 09 69 66 20 28 28 66  IFF_ECHO..if ((f
7550: 6c 61 67 73 5f 62 69 74 6d 61 73 6b 20 26 20 49  lags_bitmask & I
7560: 46 46 5f 45 43 48 4f 29 20 3d 3d 20 49 46 46 5f  FF_ECHO) == IFF_
7570: 45 43 48 4f 29 20 7b 0a 09 09 54 63 6c 5f 4c 69  ECHO) {...Tcl_Li
7580: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7590: 6e 74 28 69 6e 74 65 72 70 2c 20 66 6c 61 67 73  nt(interp, flags
75a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
75b0: 62 6a 28 22 45 43 48 4f 22 2c 20 2d 31 29 29 3b  bj("ECHO", -1));
75c0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
75d0: 41 64 64 20 61 72 72 61 79 2d 63 6f 6d 70 6c 69  Add array-compli
75e0: 61 6e 74 2f 64 69 63 74 20 65 6e 74 72 79 20 74  ant/dict entry t
75f0: 6f 20 74 68 65 20 72 65 74 75 72 6e 20 6c 69 73  o the return lis
7600: 74 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  t */..Tcl_ListOb
7610: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
7620: 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20  nterp, retlist, 
7630: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7640: 28 22 66 6c 61 67 73 22 2c 20 2d 31 29 29 3b 0a  ("flags", -1));.
7650: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
7660: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7670: 2c 20 72 65 74 6c 69 73 74 2c 20 66 6c 61 67 73  , retlist, flags
7680: 29 3b 0a 0a 09 2f 2a 20 46 65 74 63 68 20 6f 74  );.../* Fetch ot
7690: 68 65 72 20 61 74 74 72 69 62 75 74 65 73 20 66  her attributes f
76a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 66 61 63  rom the interfac
76b0: 65 20 2a 2f 0a 09 69 6f 63 74 6c 5f 72 65 74 20  e */..ioctl_ret 
76c0: 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 53 49  = ioctl(sock, SI
76d0: 4f 43 47 49 46 48 57 41 44 44 52 2c 20 26 69 66  OCGIFHWADDR, &if
76e0: 61 63 65 5f 72 65 71 29 3b 0a 09 69 66 20 28 69  ace_req);..if (i
76f0: 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b  octl_ret == 0) {
7700: 0a 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20  ...link_encap = 
7710: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 09 61 64  "unknown";....ad
7720: 64 72 5f 64 61 74 61 20 3d 20 28 75 6e 73 69 67  dr_data = (unsig
7730: 6e 65 64 20 63 68 61 72 20 2a 29 20 69 66 61 63  ned char *) ifac
7740: 65 5f 72 65 71 2e 69 66 72 5f 68 77 61 64 64 72  e_req.ifr_hwaddr
7750: 2e 73 61 5f 64 61 74 61 3b 0a 09 09 73 77 69 74  .sa_data;...swit
7760: 63 68 20 28 69 66 61 63 65 5f 72 65 71 2e 69 66  ch (iface_req.if
7770: 72 5f 68 77 61 64 64 72 2e 73 61 5f 66 61 6d 69  r_hwaddr.sa_fami
7780: 6c 79 29 20 7b 0a 09 09 09 63 61 73 65 20 41 52  ly) {....case AR
7790: 50 48 52 44 5f 45 54 48 45 52 3a 0a 09 09 09 09  PHRD_ETHER:.....
77a0: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 65 74  link_encap = "et
77b0: 68 65 72 6e 65 74 22 3b 0a 0a 09 09 09 09 54 63  hernet";......Tc
77c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
77d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
77e0: 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 53  etlist, Tcl_NewS
77f0: 74 72 69 6e 67 4f 62 6a 28 22 68 77 61 64 64 72  tringObj("hwaddr
7800: 22 2c 20 2d 31 29 29 3b 0a 09 09 09 09 54 63 6c  ", -1));.....Tcl
7810: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7820: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
7830: 74 6c 69 73 74 2c 0a 09 09 09 09 20 20 54 63 6c  tlist,.....  Tcl
7840: 5f 4f 62 6a 50 72 69 6e 74 66 28 22 25 30 32 78  _ObjPrintf("%02x
7850: 3a 25 30 32 78 3a 25 30 32 78 3a 25 30 32 78 3a  :%02x:%02x:%02x:
7860: 25 30 32 78 3a 25 30 32 78 22 2c 0a 09 09 09 09  %02x:%02x",.....
7870: 20 20 20 20 61 64 64 72 5f 64 61 74 61 5b 30 5d      addr_data[0]
7880: 2c 0a 09 09 09 09 20 20 20 20 61 64 64 72 5f 64  ,.....    addr_d
7890: 61 74 61 5b 31 5d 2c 0a 09 09 09 09 20 20 20 20  ata[1],.....    
78a0: 61 64 64 72 5f 64 61 74 61 5b 32 5d 2c 0a 09 09  addr_data[2],...
78b0: 09 09 20 20 20 20 61 64 64 72 5f 64 61 74 61 5b  ..    addr_data[
78c0: 33 5d 2c 0a 09 09 09 09 20 20 20 20 61 64 64 72  3],.....    addr
78d0: 5f 64 61 74 61 5b 34 5d 2c 0a 09 09 09 09 20 20  _data[4],.....  
78e0: 20 20 61 64 64 72 5f 64 61 74 61 5b 35 5d 0a 09    addr_data[5]..
78f0: 09 09 09 20 20 29 0a 09 09 09 09 29 3b 0a 0a 09  ...  ).....);...
7900: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
7910: 65 20 41 52 50 48 52 44 5f 41 58 32 35 3a 0a 09  e ARPHRD_AX25:..
7920: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20  ...link_encap = 
7930: 22 61 78 32 35 22 3b 0a 09 09 09 09 62 72 65 61  "ax25";.....brea
7940: 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52  k;....case ARPHR
7950: 44 5f 50 52 4f 4e 45 54 3a 0a 09 09 09 09 6c 69  D_PRONET:.....li
7960: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 70 72 6f 6e  nk_encap = "pron
7970: 65 74 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  et";.....break;.
7980: 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 43  ...case ARPHRD_C
7990: 48 41 4f 53 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65  HAOS:.....link_e
79a0: 6e 63 61 70 20 3d 20 22 63 68 61 6f 73 22 3b 0a  ncap = "chaos";.
79b0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
79c0: 73 65 20 41 52 50 48 52 44 5f 49 45 45 45 38 30  se ARPHRD_IEEE80
79d0: 32 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61  2:.....link_enca
79e0: 70 20 3d 20 22 69 65 65 65 38 30 32 22 3b 0a 09  p = "ieee802";..
79f0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
7a00: 65 20 41 52 50 48 52 44 5f 41 52 43 4e 45 54 3a  e ARPHRD_ARCNET:
7a10: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
7a20: 3d 20 22 61 72 63 6e 65 74 22 3b 0a 09 09 09 09  = "arcnet";.....
7a30: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41  break;....case A
7a40: 52 50 48 52 44 5f 41 50 50 4c 45 54 4c 4b 3a 0a  RPHRD_APPLETLK:.
7a50: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d  ....link_encap =
7a60: 20 22 61 70 70 6c 65 74 6c 6b 22 3b 0a 09 09 09   "appletlk";....
7a70: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
7a80: 41 52 50 48 52 44 5f 44 4c 43 49 3a 0a 09 09 09  ARPHRD_DLCI:....
7a90: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 64  .link_encap = "d
7aa0: 6c 63 69 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b  lci";.....break;
7ab0: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f  ....case ARPHRD_
7ac0: 41 54 4d 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e  ATM:.....link_en
7ad0: 63 61 70 20 3d 20 22 61 74 6d 22 3b 0a 09 09 09  cap = "atm";....
7ae0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
7af0: 41 52 50 48 52 44 5f 4d 45 54 52 49 43 4f 4d 3a  ARPHRD_METRICOM:
7b00: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
7b10: 3d 20 22 6d 65 74 72 69 63 6f 6d 22 3b 0a 09 09  = "metricom";...
7b20: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7b30: 20 41 52 50 48 52 44 5f 49 45 45 45 31 33 39 34   ARPHRD_IEEE1394
7b40: 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70  :.....link_encap
7b50: 20 3d 20 22 69 65 65 65 31 33 39 34 22 3b 0a 09   = "ieee1394";..
7b60: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
7b70: 65 20 41 52 50 48 52 44 5f 45 55 49 36 34 3a 0a  e ARPHRD_EUI64:.
7b80: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d  ....link_encap =
7b90: 20 22 65 75 69 36 34 22 3b 0a 09 09 09 09 62 72   "eui64";.....br
7ba0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50  eak;....case ARP
7bb0: 48 52 44 5f 49 4e 46 49 4e 49 42 41 4e 44 3a 0a  HRD_INFINIBAND:.
7bc0: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d  ....link_encap =
7bd0: 20 22 69 6e 66 69 6e 69 62 61 6e 64 22 3b 0a 09   "infiniband";..
7be0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
7bf0: 65 20 41 52 50 48 52 44 5f 53 4c 49 50 3a 0a 09  e ARPHRD_SLIP:..
7c00: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20  ...link_encap = 
7c10: 22 73 6c 69 70 22 3b 0a 09 09 09 09 62 72 65 61  "slip";.....brea
7c20: 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52  k;....case ARPHR
7c30: 44 5f 43 53 4c 49 50 3a 0a 09 09 09 09 6c 69 6e  D_CSLIP:.....lin
7c40: 6b 5f 65 6e 63 61 70 20 3d 20 22 63 73 6c 69 70  k_encap = "cslip
7c50: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ";.....break;...
7c60: 09 63 61 73 65 20 41 52 50 48 52 44 5f 53 4c 49  .case ARPHRD_SLI
7c70: 50 36 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63  P6:.....link_enc
7c80: 61 70 20 3d 20 22 73 6c 69 70 36 22 3b 0a 09 09  ap = "slip6";...
7c90: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7ca0: 20 41 52 50 48 52 44 5f 43 53 4c 49 50 36 3a 0a   ARPHRD_CSLIP6:.
7cb0: 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d  ....link_encap =
7cc0: 20 22 63 73 6c 69 70 36 22 3b 0a 09 09 09 09 62   "cslip6";.....b
7cd0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52  reak;....case AR
7ce0: 50 48 52 44 5f 52 53 52 56 44 3a 0a 09 09 09 09  PHRD_RSRVD:.....
7cf0: 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 72 73  link_encap = "rs
7d00: 72 76 64 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b  rvd";.....break;
7d10: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f  ....case ARPHRD_
7d20: 41 44 41 50 54 3a 0a 09 09 09 09 6c 69 6e 6b 5f  ADAPT:.....link_
7d30: 65 6e 63 61 70 20 3d 20 22 61 64 61 70 74 22 3b  encap = "adapt";
7d40: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
7d50: 61 73 65 20 41 52 50 48 52 44 5f 52 4f 53 45 3a  ase ARPHRD_ROSE:
7d60: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
7d70: 3d 20 22 72 6f 73 65 22 3b 0a 09 09 09 09 62 72  = "rose";.....br
7d80: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50  eak;....case ARP
7d90: 48 52 44 5f 58 32 35 3a 0a 09 09 09 09 6c 69 6e  HRD_X25:.....lin
7da0: 6b 5f 65 6e 63 61 70 20 3d 20 22 78 32 35 22 3b  k_encap = "x25";
7db0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
7dc0: 61 73 65 20 41 52 50 48 52 44 5f 48 57 58 32 35  ase ARPHRD_HWX25
7dd0: 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70  :.....link_encap
7de0: 20 3d 20 22 68 77 78 32 35 22 3b 0a 09 09 09 09   = "hwx25";.....
7df0: 62 72 65 61 6b 3b 0a 23 69 66 64 65 66 20 41 52  break;.#ifdef AR
7e00: 50 48 52 44 5f 43 41 4e 0a 09 09 09 63 61 73 65  PHRD_CAN....case
7e10: 20 41 52 50 48 52 44 5f 43 41 4e 3a 0a 09 09 09   ARPHRD_CAN:....
7e20: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 63  .link_encap = "c
7e30: 61 6e 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  an";.....break;.
7e40: 23 65 6e 64 69 66 0a 09 09 09 63 61 73 65 20 41  #endif....case A
7e50: 52 50 48 52 44 5f 50 50 50 3a 0a 09 09 09 09 6c  RPHRD_PPP:.....l
7e60: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 70 70 70  ink_encap = "ppp
7e70: 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ";.....break;...
7e80: 09 63 61 73 65 20 41 52 50 48 52 44 5f 43 49 53  .case ARPHRD_CIS
7e90: 43 4f 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63  CO:.....link_enc
7ea0: 61 70 20 3d 20 22 63 69 73 63 6f 22 3b 0a 09 09  ap = "cisco";...
7eb0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7ec0: 20 41 52 50 48 52 44 5f 4c 41 50 42 3a 0a 09 09   ARPHRD_LAPB:...
7ed0: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22  ..link_encap = "
7ee0: 6c 61 70 62 22 3b 0a 09 09 09 09 62 72 65 61 6b  lapb";.....break
7ef0: 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44  ;....case ARPHRD
7f00: 5f 44 44 43 4d 50 3a 0a 09 09 09 09 6c 69 6e 6b  _DDCMP:.....link
7f10: 5f 65 6e 63 61 70 20 3d 20 22 64 64 63 6d 70 22  _encap = "ddcmp"
7f20: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
7f30: 63 61 73 65 20 41 52 50 48 52 44 5f 52 41 57 48  case ARPHRD_RAWH
7f40: 44 4c 43 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e  DLC:.....link_en
7f50: 63 61 70 20 3d 20 22 72 61 77 68 64 6c 63 22 3b  cap = "rawhdlc";
7f60: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
7f70: 61 73 65 20 41 52 50 48 52 44 5f 54 55 4e 4e 45  ase ARPHRD_TUNNE
7f80: 4c 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61  L:.....link_enca
7f90: 70 20 3d 20 22 74 75 6e 6e 65 6c 22 3b 0a 09 09  p = "tunnel";...
7fa0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7fb0: 20 41 52 50 48 52 44 5f 54 55 4e 4e 45 4c 36 3a   ARPHRD_TUNNEL6:
7fc0: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
7fd0: 3d 20 22 74 75 6e 6e 65 6c 36 22 3b 0a 09 09 09  = "tunnel6";....
7fe0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
7ff0: 41 52 50 48 52 44 5f 46 52 41 44 3a 0a 09 09 09  ARPHRD_FRAD:....
8000: 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 66  .link_encap = "f
8010: 72 61 64 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b  rad";.....break;
8020: 0a 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f  ....case ARPHRD_
8030: 53 4b 49 50 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65  SKIP:.....link_e
8040: 6e 63 61 70 20 3d 20 22 73 6b 69 70 22 3b 0a 09  ncap = "skip";..
8050: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
8060: 65 20 41 52 50 48 52 44 5f 4c 4f 4f 50 42 41 43  e ARPHRD_LOOPBAC
8070: 4b 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61  K:.....link_enca
8080: 70 20 3d 20 22 6c 6f 6f 70 62 61 63 6b 22 3b 0a  p = "loopback";.
8090: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
80a0: 73 65 20 41 52 50 48 52 44 5f 4c 4f 43 41 4c 54  se ARPHRD_LOCALT
80b0: 4c 4b 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63  LK:.....link_enc
80c0: 61 70 20 3d 20 22 6c 6f 63 61 6c 74 61 6c 6b 22  ap = "localtalk"
80d0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
80e0: 63 61 73 65 20 41 52 50 48 52 44 5f 46 44 44 49  case ARPHRD_FDDI
80f0: 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70  :.....link_encap
8100: 20 3d 20 22 66 64 64 69 22 3b 0a 09 09 09 09 62   = "fddi";.....b
8110: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52  reak;....case AR
8120: 50 48 52 44 5f 42 49 46 3a 0a 09 09 09 09 6c 69  PHRD_BIF:.....li
8130: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 62 69 66 22  nk_encap = "bif"
8140: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
8150: 63 61 73 65 20 41 52 50 48 52 44 5f 53 49 54 3a  case ARPHRD_SIT:
8160: 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20  .....link_encap 
8170: 3d 20 22 73 69 74 22 3b 0a 09 09 09 09 62 72 65  = "sit";.....bre
8180: 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48  ak;....case ARPH
8190: 52 44 5f 49 50 44 44 50 3a 0a 09 09 09 09 6c 69  RD_IPDDP:.....li
81a0: 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 69 70 64 64  nk_encap = "ipdd
81b0: 70 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  p";.....break;..
81c0: 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 49 50  ..case ARPHRD_IP
81d0: 47 52 45 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e  GRE:.....link_en
81e0: 63 61 70 20 3d 20 22 67 72 65 22 3b 0a 09 09 09  cap = "gre";....
81f0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
8200: 41 52 50 48 52 44 5f 50 49 4d 52 45 47 3a 0a 09  ARPHRD_PIMREG:..
8210: 09 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20  ...link_encap = 
8220: 22 70 69 6d 72 65 67 22 3b 0a 09 09 09 09 62 72  "pimreg";.....br
8230: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50  eak;....case ARP
8240: 48 52 44 5f 48 49 50 50 49 3a 0a 09 09 09 09 6c  HRD_HIPPI:.....l
8250: 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22 68 69 70  ink_encap = "hip
8260: 70 69 22 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  pi";.....break;.
8270: 09 09 09 63 61 73 65 20 41 52 50 48 52 44 5f 41  ...case ARPHRD_A
8280: 53 48 3a 0a 09 09 09 09 6c 69 6e 6b 5f 65 6e 63  SH:.....link_enc
8290: 61 70 20 3d 20 22 61 73 68 22 3b 0a 09 09 09 09  ap = "ash";.....
82a0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 41  break;....case A
82b0: 52 50 48 52 44 5f 45 43 4f 4e 45 54 3a 0a 09 09  RPHRD_ECONET:...
82c0: 09 09 6c 69 6e 6b 5f 65 6e 63 61 70 20 3d 20 22  ..link_encap = "
82d0: 65 63 6f 6e 65 74 22 3b 0a 09 09 09 09 62 72 65  econet";.....bre
82e0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 41 52 50 48  ak;....case ARPH
82f0: 52 44 5f 49 52 44 41 3a 0a 09 09 09 09 6c 69 6e  RD_IRDA:.....lin
8300: 6b 5f 65 6e 63 61 70 20 3d 20 22 69 72 64 61 22  k_encap = "irda"
8310: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
8320: 0a 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ....Tcl_ListObjA
8330: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8340: 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63  erp, retlist, Tc
8350: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
8360: 6c 69 6e 6b 5f 65 6e 63 61 70 22 2c 20 2d 31 29  link_encap", -1)
8370: 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  );...Tcl_ListObj
8380: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8390: 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54  terp, retlist, T
83a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
83b0: 6c 69 6e 6b 5f 65 6e 63 61 70 2c 20 2d 31 29 29  link_encap, -1))
83c0: 3b 0a 09 7d 0a 0a 09 69 6f 63 74 6c 5f 72 65 74  ;..}...ioctl_ret
83d0: 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 53   = ioctl(sock, S
83e0: 49 4f 43 47 49 46 4d 45 54 52 49 43 2c 20 26 69  IOCGIFMETRIC, &i
83f0: 66 61 63 65 5f 72 65 71 29 3b 0a 09 69 66 20 28  face_req);..if (
8400: 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20  ioctl_ret == 0) 
8410: 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  {...Tcl_ListObjA
8420: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8430: 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63  erp, retlist, Tc
8440: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
8450: 6d 65 74 72 69 63 22 2c 20 2d 31 29 29 3b 0a 09  metric", -1));..
8460: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
8470: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8480: 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e  , retlist, Tcl_N
8490: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 66 61  ewWideIntObj(ifa
84a0: 63 65 5f 72 65 71 2e 69 66 72 5f 6d 65 74 72 69  ce_req.ifr_metri
84b0: 63 20 2b 20 31 29 29 3b 0a 09 7d 0a 0a 09 69 6f  c + 1));..}...io
84c0: 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28  ctl_ret = ioctl(
84d0: 73 6f 63 6b 2c 20 53 49 4f 43 47 49 46 4d 54 55  sock, SIOCGIFMTU
84e0: 2c 20 26 69 66 61 63 65 5f 72 65 71 29 3b 0a 09  , &iface_req);..
84f0: 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 3d 3d  if (ioctl_ret ==
8500: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73 74   0) {...Tcl_List
8510: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
8520: 28 69 6e 74 65 72 70 2c 20 72 65 74 6c 69 73 74  (interp, retlist
8530: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8540: 62 6a 28 22 6d 74 75 22 2c 20 2d 31 29 29 3b 0a  bj("mtu", -1));.
8550: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
8560: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8570: 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f  p, retlist, Tcl_
8580: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 66  NewWideIntObj(if
8590: 61 63 65 5f 72 65 71 2e 69 66 72 5f 6d 74 75 29  ace_req.ifr_mtu)
85a0: 29 3b 0a 09 7d 0a 0a 09 69 6f 63 74 6c 5f 72 65  );..}...ioctl_re
85b0: 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20  t = ioctl(sock, 
85c0: 53 49 4f 43 47 49 46 49 4e 44 45 58 2c 20 26 69  SIOCGIFINDEX, &i
85d0: 66 61 63 65 5f 72 65 71 29 3b 0a 09 69 66 20 28  face_req);..if (
85e0: 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20  ioctl_ret == 0) 
85f0: 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  {...Tcl_ListObjA
8600: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8610: 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 54 63  erp, retlist, Tc
8620: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
8630: 69 6e 64 65 78 22 2c 20 2d 31 29 29 3b 0a 09 09  index", -1));...
8640: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8650: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8660: 20 72 65 74 6c 69 73 74 2c 20 54 63 6c 5f 4e 65   retlist, Tcl_Ne
8670: 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 66 61 63  wWideIntObj(ifac
8680: 65 5f 72 65 71 2e 69 66 72 5f 69 66 69 6e 64 65  e_req.ifr_ifinde
8690: 78 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f  x));..}...if (so
86a0: 63 6b 5f 76 34 20 21 3d 20 2d 31 29 20 7b 0a 09  ck_v4 != -1) {..
86b0: 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63  .ioctl_ret = ioc
86c0: 74 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49 4f 43  tl(sock_v4, SIOC
86d0: 47 49 46 41 44 44 52 2c 20 26 69 66 61 63 65 5f  GIFADDR, &iface_
86e0: 72 65 71 29 3b 0a 09 09 69 66 20 28 69 6f 63 74  req);...if (ioct
86f0: 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09  l_ret == 0) {...
8700: 09 74 75 61 70 69 5f 70 72 69 76 61 74 65 5f 61  .tuapi_private_a
8710: 70 70 65 6e 64 5f 73 6f 63 6b 61 64 64 72 5f 74  ppend_sockaddr_t
8720: 6f 5f 74 63 6c 6f 62 6a 28 69 6e 74 65 72 70 2c  o_tclobj(interp,
8730: 20 72 65 74 6c 69 73 74 2c 20 22 61 64 64 72 65   retlist, "addre
8740: 73 73 22 2c 20 26 69 66 61 63 65 5f 72 65 71 2e  ss", &iface_req.
8750: 69 66 72 5f 61 64 64 72 29 3b 0a 09 09 7d 0a 0a  ifr_addr);...}..
8760: 09 09 69 66 20 28 66 6c 61 67 5f 70 6f 69 6e 74  ..if (flag_point
8770: 6f 70 6f 69 6e 74 29 20 7b 0a 09 09 09 2f 2a 20  opoint) {..../* 
8780: 50 6f 69 6e 74 2d 74 6f 2d 50 6f 69 6e 74 20 69  Point-to-Point i
8790: 6e 74 65 72 66 61 63 65 73 20 2a 2f 0a 09 09 09  nterfaces */....
87a0: 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74  ioctl_ret = ioct
87b0: 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49 4f 43 47  l(sock_v4, SIOCG
87c0: 49 46 44 53 54 41 44 44 52 2c 20 26 69 66 61 63  IFDSTADDR, &ifac
87d0: 65 5f 72 65 71 29 3b 0a 09 09 09 69 66 20 28 69  e_req);....if (i
87e0: 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b  octl_ret == 0) {
87f0: 0a 09 09 09 09 74 75 61 70 69 5f 70 72 69 76 61  .....tuapi_priva
8800: 74 65 5f 61 70 70 65 6e 64 5f 73 6f 63 6b 61 64  te_append_sockad
8810: 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a 28 69 6e 74  dr_to_tclobj(int
8820: 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 22 64  erp, retlist, "d
8830: 65 73 74 69 6e 61 74 69 6f 6e 22 2c 20 26 69 66  estination", &if
8840: 61 63 65 5f 72 65 71 2e 69 66 72 5f 61 64 64 72  ace_req.ifr_addr
8850: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  );....}...}....i
8860: 66 20 28 66 6c 61 67 5f 62 72 6f 61 64 63 61 73  f (flag_broadcas
8870: 74 29 20 7b 0a 09 09 09 2f 2a 20 42 72 6f 61 64  t) {..../* Broad
8880: 63 61 73 74 20 69 6e 74 65 72 66 61 63 65 73 20  cast interfaces 
8890: 2a 2f 0a 09 09 09 69 6f 63 74 6c 5f 72 65 74 20  */....ioctl_ret 
88a0: 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 5f 76 34 2c  = ioctl(sock_v4,
88b0: 20 53 49 4f 43 47 49 46 42 52 44 41 44 44 52 2c   SIOCGIFBRDADDR,
88c0: 20 26 69 66 61 63 65 5f 72 65 71 29 3b 0a 09 09   &iface_req);...
88d0: 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 3d  .if (ioctl_ret =
88e0: 3d 20 30 29 20 7b 0a 09 09 09 09 74 75 61 70 69  = 0) {.....tuapi
88f0: 5f 70 72 69 76 61 74 65 5f 61 70 70 65 6e 64 5f  _private_append_
8900: 73 6f 63 6b 61 64 64 72 5f 74 6f 5f 74 63 6c 6f  sockaddr_to_tclo
8910: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 74 6c 69  bj(interp, retli
8920: 73 74 2c 20 22 62 72 6f 61 64 63 61 73 74 22 2c  st, "broadcast",
8930: 20 26 69 66 61 63 65 5f 72 65 71 2e 69 66 72 5f   &iface_req.ifr_
8940: 61 64 64 72 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  addr);....}...}.
8950: 0a 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69  ...ioctl_ret = i
8960: 6f 63 74 6c 28 73 6f 63 6b 5f 76 34 2c 20 53 49  octl(sock_v4, SI
8970: 4f 43 47 49 46 4e 45 54 4d 41 53 4b 2c 20 26 69  OCGIFNETMASK, &i
8980: 66 61 63 65 5f 72 65 71 29 3b 0a 09 09 69 66 20  face_req);...if 
8990: 28 69 6f 63 74 6c 5f 72 65 74 20 3d 3d 20 30 29  (ioctl_ret == 0)
89a0: 20 7b 0a 09 09 09 74 75 61 70 69 5f 70 72 69 76   {....tuapi_priv
89b0: 61 74 65 5f 61 70 70 65 6e 64 5f 73 6f 63 6b 61  ate_append_socka
89c0: 64 64 72 5f 74 6f 5f 74 63 6c 6f 62 6a 28 69 6e  ddr_to_tclobj(in
89d0: 74 65 72 70 2c 20 72 65 74 6c 69 73 74 2c 20 22  terp, retlist, "
89e0: 6e 65 74 6d 61 73 6b 22 2c 20 26 69 66 61 63 65  netmask", &iface
89f0: 5f 72 65 71 2e 69 66 72 5f 61 64 64 72 29 3b 0a  _req.ifr_addr);.
8a00: 09 09 7d 0a 09 7d 0a 0a 09 54 63 6c 5f 53 65 74  ..}..}...Tcl_Set
8a10: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8a20: 2c 20 72 65 74 6c 69 73 74 29 3b 0a 0a 09 72 65  , retlist);...re
8a30: 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a  turn(TCL_OK);.}.
8a40: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61 70  .static int tuap
8a50: 69 5f 69 66 63 6f 6e 66 69 67 5f 63 6f 6e 66 28  i_ifconfig_conf(
8a60: 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54  ClientData cd, T
8a70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8a80: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
8a90: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
8aa0: 5b 5d 2c 20 69 6e 74 20 73 6f 63 6b 2c 20 69 6e  [], int sock, in
8ab0: 74 20 73 6f 63 6b 5f 76 34 2c 20 69 6e 74 20 73  t sock_v4, int s
8ac0: 6f 63 6b 5f 76 36 29 20 7b 0a 09 54 63 6c 5f 4f  ock_v6) {..Tcl_O
8ad0: 62 6a 20 2a 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f  bj *option_name_
8ae0: 6f 62 6a 2c 20 2a 6f 70 74 69 6f 6e 5f 76 61 6c  obj, *option_val
8af0: 5f 6f 62 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  _obj;..Tcl_Obj *
8b00: 2a 66 6c 61 67 73 5f 6f 62 6a 76 3b 0a 09 73 74  *flags_objv;..st
8b10: 72 75 63 74 20 69 66 72 65 71 20 69 66 61 63 65  ruct ifreq iface
8b20: 5f 72 65 71 3b 0a 09 73 74 72 75 63 74 20 73 6f  _req;..struct so
8b30: 63 6b 61 64 64 72 20 2a 74 6d 70 5f 69 6f 63 74  ckaddr *tmp_ioct
8b40: 6c 5f 61 64 64 72 3b 0a 09 63 6f 6e 73 74 20 63  l_addr;..const c
8b50: 68 61 72 20 2a 69 66 61 63 65 3b 0a 09 73 68 6f  har *iface;..sho
8b60: 72 74 20 66 6c 61 67 73 3b 0a 09 69 6e 74 20 66  rt flags;..int f
8b70: 6c 61 67 73 5f 6f 62 6a 63 3b 0a 09 69 6e 74 20  lags_objc;..int 
8b80: 74 6d 70 5f 73 6f 63 6b 2c 20 74 6d 70 5f 69 6f  tmp_sock, tmp_io
8b90: 63 74 6c 3b 0a 09 69 6e 74 20 69 6f 63 74 6c 5f  ctl;..int ioctl_
8ba0: 72 65 74 2c 20 74 63 6c 5f 72 65 74 2c 20 70 61  ret, tcl_ret, pa
8bb0: 72 73 65 5f 72 65 74 3b 0a 0a 09 69 66 61 63 65  rse_ret;...iface
8bc0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8bd0: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 09 69 66 20  (objv[1]);...if 
8be0: 28 28 73 74 72 6c 65 6e 28 69 66 61 63 65 29 20  ((strlen(iface) 
8bf0: 2b 20 31 29 20 3e 3d 20 49 46 4e 41 4d 53 49 5a  + 1) >= IFNAMSIZ
8c00: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ) {...Tcl_SetObj
8c10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
8c20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8c30: 22 69 6e 74 65 72 66 61 63 65 20 6e 61 6d 65 20  "interface name 
8c40: 74 6f 6f 20 6c 6f 6e 67 22 2c 20 2d 31 29 29 3b  too long", -1));
8c50: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
8c60: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6f 62 6a 63  RROR);..}...objc
8c70: 20 2d 3d 20 32 3b 0a 09 6f 62 6a 76 20 2b 3d 20   -= 2;..objv += 
8c80: 32 3b 0a 0a 09 66 6f 72 20 28 3b 20 6f 62 6a 63  2;...for (; objc
8c90: 20 3e 20 30 3b 20 6f 62 6a 63 2d 2d 2c 6f 62 6a   > 0; objc--,obj
8ca0: 76 2b 2b 29 20 7b 0a 09 09 2f 2a 20 50 72 65 70  v++) {.../* Prep
8cb0: 61 72 65 20 66 6f 72 20 61 6e 20 69 6f 63 74 6c  are for an ioctl
8cc0: 28 29 20 2a 2f 0a 09 09 73 74 72 63 70 79 28 69  () */...strcpy(i
8cd0: 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 6e 61 6d  face_req.ifr_nam
8ce0: 65 2c 20 69 66 61 63 65 29 3b 0a 09 09 74 6d 70  e, iface);...tmp
8cf0: 5f 69 6f 63 74 6c 20 3d 20 2d 31 3b 0a 0a 09 09  _ioctl = -1;....
8d00: 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 20  option_name_obj 
8d10: 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 09 09 69 66  = objv[0];....if
8d20: 20 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09   (objc == 1) {..
8d30: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
8d40: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
8d50: 62 6a 50 72 69 6e 74 66 28 22 6f 70 74 69 6f 6e  bjPrintf("option
8d60: 20 5c 22 25 73 5c 22 20 72 65 71 75 69 72 65 73   \"%s\" requires
8d70: 20 61 6e 20 61 72 67 75 6d 65 6e 74 22 2c 20 54   an argument", T
8d80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 70 74  cl_GetString(opt
8d90: 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29 3b  ion_name_obj)));
8da0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  .....return(TCL_
8db0: 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 6f  ERROR);...}....o
8dc0: 62 6a 63 2d 2d 3b 0a 09 09 6f 62 6a 76 2b 2b 3b  bjc--;...objv++;
8dd0: 0a 0a 09 09 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f  ....option_val_o
8de0: 62 6a 20 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 09  bj = objv[0];...
8df0: 09 73 77 69 74 63 68 20 28 74 75 61 70 69 5f 69  .switch (tuapi_i
8e00: 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68 61  nternal_simpleha
8e10: 73 68 5f 6f 62 6a 28 6f 70 74 69 6f 6e 5f 6e 61  sh_obj(option_na
8e20: 6d 65 5f 6f 62 6a 29 29 20 7b 0a 09 09 09 63 61  me_obj)) {....ca
8e30: 73 65 20 30 78 36 64 39 38 37 30 66 33 3a 20 2f  se 0x6d9870f3: /
8e40: 2a 20 66 6c 61 67 73 20 2a 2f 0a 09 09 09 09 66  * flags */.....f
8e50: 6c 61 67 73 20 3d 20 30 3b 0a 0a 09 09 09 09 74  lags = 0;......t
8e60: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 4c 69 73  cl_ret = Tcl_Lis
8e70: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
8e80: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 5f 76  interp, option_v
8e90: 61 6c 5f 6f 62 6a 2c 20 26 66 6c 61 67 73 5f 6f  al_obj, &flags_o
8ea0: 62 6a 63 2c 20 26 66 6c 61 67 73 5f 6f 62 6a 76  bjc, &flags_objv
8eb0: 29 3b 0a 09 09 09 09 69 66 20 28 74 63 6c 5f 72  );.....if (tcl_r
8ec0: 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  et != TCL_OK) {.
8ed0: 09 09 09 09 09 72 65 74 75 72 6e 28 74 63 6c 5f  .....return(tcl_
8ee0: 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  ret);.....}.....
8ef0: 09 66 6f 72 20 28 3b 20 66 6c 61 67 73 5f 6f 62  .for (; flags_ob
8f00: 6a 63 20 3e 20 30 3b 20 66 6c 61 67 73 5f 6f 62  jc > 0; flags_ob
8f10: 6a 63 2d 2d 2c 66 6c 61 67 73 5f 6f 62 6a 76 2b  jc--,flags_objv+
8f20: 2b 29 20 7b 0a 09 09 09 09 09 73 77 69 74 63 68  +) {......switch
8f30: 20 28 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c   (tuapi_internal
8f40: 5f 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28  _simplehash_obj(
8f50: 66 6c 61 67 73 5f 6f 62 6a 76 5b 30 5d 29 29 20  flags_objv[0])) 
8f60: 7b 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 32  {.......case 0x2
8f70: 61 64 30 3a 20 2f 2a 20 55 50 20 2a 2f 0a 09 09  ad0: /* UP */...
8f80: 09 09 09 09 09 66 6c 61 67 73 20 7c 3d 20 49 46  .....flags |= IF
8f90: 46 5f 55 50 3b 0a 09 09 09 09 09 09 09 62 72 65  F_UP;........bre
8fa0: 61 6b 3b 0a 09 09 09 09 09 09 63 61 73 65 20 30  ak;.......case 0
8fb0: 78 31 61 65 66 37 66 35 34 3a 20 2f 2a 20 42 52  x1aef7f54: /* BR
8fc0: 4f 41 44 43 41 53 54 20 2a 2f 0a 09 09 09 09 09  OADCAST */......
8fd0: 09 09 66 6c 61 67 73 20 7c 3d 20 49 46 46 5f 42  ..flags |= IFF_B
8fe0: 52 4f 41 44 43 41 53 54 3b 0a 09 09 09 09 09 09  ROADCAST;.......
8ff0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 63 61  .break;.......ca
9000: 73 65 20 30 78 63 32 35 32 61 62 64 34 3a 20 2f  se 0xc252abd4: /
9010: 2a 20 50 4f 49 4e 54 4f 50 4f 49 4e 54 20 2a 2f  * POINTOPOINT */
9020: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
9030: 20 49 46 46 5f 50 4f 49 4e 54 4f 50 4f 49 4e 54   IFF_POINTOPOINT
9040: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
9050: 09 09 09 09 09 09 63 61 73 65 20 30 78 34 38 62  ......case 0x48b
9060: 30 61 38 63 37 3a 20 2f 2a 20 44 45 42 55 47 20  0a8c7: /* DEBUG 
9070: 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20  */........flags 
9080: 7c 3d 20 49 46 46 5f 44 45 42 55 47 3b 0a 09 09  |= IFF_DEBUG;...
9090: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
90a0: 09 09 63 61 73 65 20 30 78 34 64 33 64 62 63 64  ..case 0x4d3dbcd
90b0: 33 3a 20 2f 2a 20 4e 4f 54 52 41 49 4c 45 52 53  3: /* NOTRAILERS
90c0: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73   */........flags
90d0: 20 7c 3d 20 49 46 46 5f 4e 4f 54 52 41 49 4c 45   |= IFF_NOTRAILE
90e0: 52 53 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  RS;........break
90f0: 3b 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 65  ;.......case 0xe
9100: 39 37 37 33 31 34 37 3a 20 2f 2a 20 52 55 4e 4e  9773147: /* RUNN
9110: 49 4e 47 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c  ING */........fl
9120: 61 67 73 20 7c 3d 20 49 46 46 5f 52 55 4e 4e 49  ags |= IFF_RUNNI
9130: 4e 47 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  NG;........break
9140: 3b 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 65  ;.......case 0xe
9150: 39 66 30 36 62 35 30 3a 20 2f 2a 20 4e 4f 41 52  9f06b50: /* NOAR
9160: 50 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67  P */........flag
9170: 73 20 7c 3d 20 49 46 46 5f 4e 4f 41 52 50 3b 0a  s |= IFF_NOARP;.
9180: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
9190: 09 09 09 09 63 61 73 65 20 30 78 66 39 31 33 32  ....case 0xf9132
91a0: 33 63 33 3a 20 2f 2a 20 50 52 4f 4d 49 53 43 20  3c3: /* PROMISC 
91b0: 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20  */........flags 
91c0: 7c 3d 20 49 46 46 5f 50 52 4f 4d 49 53 43 3b 0a  |= IFF_PROMISC;.
91d0: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
91e0: 09 09 09 09 63 61 73 65 20 30 78 39 62 32 61 31  ....case 0x9b2a1
91f0: 38 34 39 3a 20 2f 2a 20 41 4c 4c 4d 55 4c 54 49  849: /* ALLMULTI
9200: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73   */........flags
9210: 20 7c 3d 20 49 46 46 5f 41 4c 4c 4d 55 4c 54 49   |= IFF_ALLMULTI
9220: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
9230: 09 09 09 09 09 09 63 61 73 65 20 30 78 31 61 37  ......case 0x1a7
9240: 34 31 34 64 32 3a 20 2f 2a 20 4d 41 53 54 45 52  414d2: /* MASTER
9250: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73   */........flags
9260: 20 7c 3d 20 49 46 46 5f 4d 41 53 54 45 52 3b 0a   |= IFF_MASTER;.
9270: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
9280: 09 09 09 09 63 61 73 65 20 30 78 33 39 39 30 36  ....case 0x39906
9290: 39 63 35 3a 20 2f 2a 20 53 4c 41 56 45 20 2a 2f  9c5: /* SLAVE */
92a0: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
92b0: 20 49 46 46 5f 53 4c 41 56 45 3b 0a 09 09 09 09   IFF_SLAVE;.....
92c0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
92d0: 63 61 73 65 20 30 78 34 64 65 39 32 38 64 34 3a  case 0x4de928d4:
92e0: 20 2f 2a 20 4d 55 4c 54 49 43 41 53 54 20 2a 2f   /* MULTICAST */
92f0: 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20 7c 3d  ........flags |=
9300: 20 49 46 46 5f 4d 55 4c 54 49 43 41 53 54 3b 0a   IFF_MULTICAST;.
9310: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
9320: 09 09 09 09 63 61 73 65 20 30 78 32 61 33 35 64  ....case 0x2a35d
9330: 63 34 63 3a 20 2f 2a 20 50 4f 52 54 53 45 4c 20  c4c: /* PORTSEL 
9340: 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73 20  */........flags 
9350: 7c 3d 20 49 46 46 5f 50 4f 52 54 53 45 4c 3b 0a  |= IFF_PORTSEL;.
9360: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
9370: 09 09 09 09 63 61 73 65 20 30 78 64 31 38 30 61  ....case 0xd180a
9380: 63 31 3a 20 2f 2a 20 41 55 54 4f 4d 45 44 49 41  c1: /* AUTOMEDIA
9390: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73   */........flags
93a0: 20 7c 3d 20 49 46 46 5f 41 55 54 4f 4d 45 44 49   |= IFF_AUTOMEDI
93b0: 41 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b  A;........break;
93c0: 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 65 38  .......case 0xe8
93d0: 62 61 30 32 63 33 3a 20 2f 2a 20 44 59 4e 41 4d  ba02c3: /* DYNAM
93e0: 49 43 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61  IC */........fla
93f0: 67 73 20 7c 3d 20 49 46 46 5f 44 59 4e 41 4d 49  gs |= IFF_DYNAMI
9400: 43 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b  C;........break;
9410: 0a 09 09 09 09 09 09 63 61 73 65 20 30 78 31 36  .......case 0x16
9420: 63 38 62 34 64 30 3a 20 2f 2a 20 4c 4f 57 45 52  c8b4d0: /* LOWER
9430: 5f 55 50 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c  _UP */........fl
9440: 61 67 73 20 7c 3d 20 49 46 46 5f 4c 4f 57 45 52  ags |= IFF_LOWER
9450: 5f 55 50 3b 0a 09 09 09 09 09 09 09 62 72 65 61  _UP;........brea
9460: 6b 3b 0a 09 09 09 09 09 09 63 61 73 65 20 30 78  k;.......case 0x
9470: 32 39 33 39 35 39 64 34 3a 20 2f 2a 20 44 4f 52  293959d4: /* DOR
9480: 4d 41 4e 54 20 2a 2f 0a 09 09 09 09 09 09 09 66  MANT */........f
9490: 6c 61 67 73 20 7c 3d 20 49 46 46 5f 44 4f 52 4d  lags |= IFF_DORM
94a0: 41 4e 54 3b 0a 09 09 09 09 09 09 09 62 72 65 61  ANT;........brea
94b0: 6b 3b 0a 23 69 66 64 65 66 20 49 46 46 5f 45 43  k;.#ifdef IFF_EC
94c0: 48 4f 0a 09 09 09 09 09 09 63 61 73 65 20 30 78  HO.......case 0x
94d0: 38 62 30 65 34 34 66 3a 20 2f 2a 20 45 43 48 4f  8b0e44f: /* ECHO
94e0: 20 2a 2f 0a 09 09 09 09 09 09 09 66 6c 61 67 73   */........flags
94f0: 20 7c 3d 20 49 46 46 5f 45 43 48 4f 3b 0a 09 09   |= IFF_ECHO;...
9500: 09 09 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64  .....break;.#end
9510: 69 66 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  if......}.....}.
9520: 0a 09 09 09 09 69 66 61 63 65 5f 72 65 71 2e 69  .....iface_req.i
9530: 66 72 5f 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  fr_flags = flags
9540: 3b 0a 0a 09 09 09 09 69 6f 63 74 6c 5f 72 65 74  ;......ioctl_ret
9550: 20 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 53   = ioctl(sock, S
9560: 49 4f 43 53 49 46 46 4c 41 47 53 2c 20 26 69 66  IOCSIFFLAGS, &if
9570: 61 63 65 5f 72 65 71 29 3b 0a 09 09 09 09 69 66  ace_req);.....if
9580: 20 28 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30   (ioctl_ret != 0
9590: 29 20 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74  ) {......Tcl_Set
95a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
95b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
95c0: 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e  bj(strerror(errn
95d0: 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 09  o), -1));.......
95e0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
95f0: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 62 72  );.....}......br
9600: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 35  eak;....case 0x5
9610: 65 39 64 30 33 65 33 3a 20 2f 2a 20 6d 65 74 72  e9d03e3: /* metr
9620: 69 63 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  ic */....case 0x
9630: 31 62 37 61 37 35 3a 20 2f 2a 20 6d 74 75 20 2a  1b7a75: /* mtu *
9640: 2f 0a 09 09 09 63 61 73 65 20 30 78 37 63 33 38  /....case 0x7c38
9650: 39 31 66 32 3a 20 2f 2a 20 68 77 61 64 64 72 20  91f2: /* hwaddr 
9660: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 62 66 37  */....case 0xbf7
9670: 32 61 39 36 39 3a 20 2f 2a 20 61 64 64 6d 75 6c  2a969: /* addmul
9680: 74 69 20 2a 2f 0a 09 09 09 63 61 73 65 20 30 78  ti */....case 0x
9690: 62 61 37 30 38 39 36 39 3a 20 2f 2a 20 64 65 6c  ba708969: /* del
96a0: 6d 75 6c 74 69 20 2a 2f 0a 09 09 09 63 61 73 65  multi */....case
96b0: 20 30 78 64 64 38 37 36 65 35 3a 20 2f 2a 20 6e   0xdd876e5: /* n
96c0: 61 6d 65 20 2a 2f 0a 09 09 09 09 09 54 63 6c 5f  ame */......Tcl_
96d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
96e0: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e  erp, Tcl_ObjPrin
96f0: 74 66 28 22 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  tf("option \"%s\
9700: 22 20 75 6e 73 75 70 70 6f 72 74 65 64 22 2c 20  " unsupported", 
9710: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 70  Tcl_GetString(op
9720: 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29  tion_name_obj)))
9730: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 54  ;.......return(T
9740: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 09 62  CL_ERROR);.....b
9750: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
9760: 34 65 39 61 65 61 66 33 3a 20 2f 2a 20 61 64 64  4e9aeaf3: /* add
9770: 72 65 73 73 20 2a 2f 0a 09 09 09 09 69 66 20 28  ress */.....if (
9780: 74 6d 70 5f 69 6f 63 74 6c 20 3d 3d 20 2d 31 29  tmp_ioctl == -1)
9790: 20 7b 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63 74   {......tmp_ioct
97a0: 6c 20 3d 20 53 49 4f 43 53 49 46 41 44 44 52 3b  l = SIOCSIFADDR;
97b0: 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c 5f  ......tmp_ioctl_
97c0: 61 64 64 72 20 3d 20 26 69 66 61 63 65 5f 72 65  addr = &iface_re
97d0: 71 2e 69 66 72 5f 61 64 64 72 3b 0a 09 09 09 09  q.ifr_addr;.....
97e0: 7d 0a 0a 09 09 09 63 61 73 65 20 30 78 65 63 30  }.....case 0xec0
97f0: 35 37 30 36 65 3a 20 2f 2a 20 64 65 73 74 69 6e  5706e: /* destin
9800: 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 69 66 20  ation */.....if 
9810: 28 74 6d 70 5f 69 6f 63 74 6c 20 3d 3d 20 2d 31  (tmp_ioctl == -1
9820: 29 20 7b 0a 09 09 09 09 09 74 6d 70 5f 69 6f 63  ) {......tmp_ioc
9830: 74 6c 20 3d 20 53 49 4f 43 53 49 46 44 53 54 41  tl = SIOCSIFDSTA
9840: 44 44 52 3b 0a 09 09 09 09 09 74 6d 70 5f 69 6f  DDR;......tmp_io
9850: 63 74 6c 5f 61 64 64 72 20 3d 20 26 69 66 61 63  ctl_addr = &ifac
9860: 65 5f 72 65 71 2e 69 66 72 5f 64 73 74 61 64 64  e_req.ifr_dstadd
9870: 72 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 63 61 73  r;.....}.....cas
9880: 65 20 30 78 33 65 61 37 65 36 37 34 3a 20 2f 2a  e 0x3ea7e674: /*
9890: 20 62 72 6f 61 64 63 61 73 74 20 2a 2f 0a 09 09   broadcast */...
98a0: 09 09 69 66 20 28 74 6d 70 5f 69 6f 63 74 6c 20  ..if (tmp_ioctl 
98b0: 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 09 09 74 6d  == -1) {......tm
98c0: 70 5f 69 6f 63 74 6c 20 3d 20 53 49 4f 43 53 49  p_ioctl = SIOCSI
98d0: 46 42 52 44 41 44 44 52 3b 0a 09 09 09 09 09 74  FBRDADDR;......t
98e0: 6d 70 5f 69 6f 63 74 6c 5f 61 64 64 72 20 3d 20  mp_ioctl_addr = 
98f0: 26 69 66 61 63 65 5f 72 65 71 2e 69 66 72 5f 62  &iface_req.ifr_b
9900: 72 6f 61 64 61 64 64 72 3b 0a 09 09 09 09 7d 0a  roadaddr;.....}.
9910: 0a 09 09 09 63 61 73 65 20 30 78 34 64 36 35 65  ....case 0x4d65e
9920: 65 36 62 3a 20 2f 2a 20 6e 65 74 6d 61 73 6b 20  e6b: /* netmask 
9930: 2a 2f 0a 09 09 09 09 69 66 20 28 74 6d 70 5f 69  */.....if (tmp_i
9940: 6f 63 74 6c 20 3d 3d 20 2d 31 29 20 7b 0a 09 09  octl == -1) {...
9950: 09 09 09 74 6d 70 5f 69 6f 63 74 6c 20 3d 20 53  ...tmp_ioctl = S
9960: 49 4f 43 53 49 46 4e 45 54 4d 41 53 4b 3b 0a 09  IOCSIFNETMASK;..
9970: 09 09 09 09 74 6d 70 5f 69 6f 63 74 6c 5f 61 64  ....tmp_ioctl_ad
9980: 64 72 20 3d 20 26 69 66 61 63 65 5f 72 65 71 2e  dr = &iface_req.
9990: 69 66 72 5f 6e 65 74 6d 61 73 6b 3b 0a 09 09 09  ifr_netmask;....
99a0: 09 7d 0a 0a 09 09 09 09 70 61 72 73 65 5f 72 65  .}......parse_re
99b0: 74 20 3d 20 74 75 61 70 69 5f 70 72 69 76 61 74  t = tuapi_privat
99c0: 65 5f 67 65 74 5f 73 6f 63 6b 61 64 64 72 5f 66  e_get_sockaddr_f
99d0: 72 6f 6d 5f 6f 62 6a 28 6f 70 74 69 6f 6e 5f 76  rom_obj(option_v
99e0: 61 6c 5f 6f 62 6a 2c 20 74 6d 70 5f 69 6f 63 74  al_obj, tmp_ioct
99f0: 6c 5f 61 64 64 72 29 3b 0a 09 09 09 09 69 66 20  l_addr);.....if 
9a00: 28 70 61 72 73 65 5f 72 65 74 20 21 3d 20 30 29  (parse_ret != 0)
9a10: 20 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f   {......Tcl_SetO
9a20: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9a30: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22   Tcl_ObjPrintf("
9a40: 75 6e 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20  unable to parse 
9a50: 5c 22 25 73 5c 22 20 61 73 20 61 6e 20 61 64 64  \"%s\" as an add
9a60: 72 65 73 73 22 2c 20 54 63 6c 5f 47 65 74 53 74  ress", Tcl_GetSt
9a70: 72 69 6e 67 28 6f 70 74 69 6f 6e 5f 76 61 6c 5f  ring(option_val_
9a80: 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 09 09 72 65  obj)));.......re
9a90: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
9aa0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 77 69 74  .....}......swit
9ab0: 63 68 20 28 74 6d 70 5f 69 6f 63 74 6c 5f 61 64  ch (tmp_ioctl_ad
9ac0: 64 72 2d 3e 73 61 5f 66 61 6d 69 6c 79 29 20 7b  dr->sa_family) {
9ad0: 0a 09 09 09 09 09 63 61 73 65 20 41 46 5f 49 4e  ......case AF_IN
9ae0: 45 54 3a 0a 09 09 09 09 09 09 74 6d 70 5f 73 6f  ET:.......tmp_so
9af0: 63 6b 20 3d 20 73 6f 63 6b 5f 76 34 3b 0a 0a 09  ck = sock_v4;...
9b00: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
9b10: 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36 3a 0a  .case AF_INET6:.
9b20: 09 09 09 09 09 09 74 6d 70 5f 73 6f 63 6b 20 3d  ......tmp_sock =
9b30: 20 73 6f 63 6b 5f 76 36 3b 0a 0a 09 09 09 09 09   sock_v6;.......
9b40: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66  .break;......def
9b50: 61 75 6c 74 3a 0a 09 09 09 09 09 09 54 63 6c 5f  ault:.......Tcl_
9b60: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
9b70: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
9b80: 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65 20 74 6f  ngObj("unable to
9b90: 20 64 65 74 65 72 6d 69 6e 65 20 61 64 64 72 65   determine addre
9ba0: 73 73 20 66 61 6d 69 6c 79 20 6f 66 20 73 6f 63  ss family of soc
9bb0: 6b 61 64 64 72 22 2c 20 2d 31 29 29 3b 0a 09 09  kaddr", -1));...
9bc0: 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
9bd0: 52 52 4f 52 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  RROR);.....}....
9be0: 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f  ..ioctl_ret = io
9bf0: 63 74 6c 28 74 6d 70 5f 73 6f 63 6b 2c 20 74 6d  ctl(tmp_sock, tm
9c00: 70 5f 69 6f 63 74 6c 2c 20 26 69 66 61 63 65 5f  p_ioctl, &iface_
9c10: 72 65 71 29 3b 0a 09 09 09 09 69 66 20 28 69 6f  req);.....if (io
9c20: 63 74 6c 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  ctl_ret != 0) {.
9c30: 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52  .....Tcl_SetObjR
9c40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
9c50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
9c60: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c 20  trerror(errno), 
9c70: 2d 31 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  -1));.......retu
9c80: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
9c90: 09 09 09 7d 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ...}......break;
9ca0: 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
9cb0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
9cc0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
9cd0: 6a 50 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e  jPrintf("unknown
9ce0: 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 22 2c   option \"%s\"",
9cf0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9d00: 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29  ption_name_obj))
9d10: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 54  );......return(T
9d20: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09  CL_ERROR);...}..
9d30: 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f  }...return(TCL_O
9d40: 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  K);.}..static in
9d50: 74 20 74 75 61 70 69 5f 69 66 63 6f 6e 66 69 67  t tuapi_ifconfig
9d60: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20  (ClientData cd, 
9d70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9d80: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
9d90: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
9da0: 76 5b 5d 29 20 7b 0a 09 69 6e 74 20 73 6f 63 6b  v[]) {..int sock
9db0: 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 2c 20 73 6f  _v4, sock_v6, so
9dc0: 63 6b 3b 0a 09 69 6e 74 20 72 65 74 76 61 6c 20  ck;..int retval 
9dd0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 09 73  = TCL_ERROR;...s
9de0: 6f 63 6b 20 3d 20 74 75 61 70 69 5f 69 6e 74 65  ock = tuapi_inte
9df0: 72 6e 61 6c 5f 67 65 74 73 6f 63 6b 28 26 73 6f  rnal_getsock(&so
9e00: 63 6b 5f 76 34 2c 20 26 73 6f 63 6b 5f 76 36 29  ck_v4, &sock_v6)
9e10: 3b 0a 09 69 66 20 28 73 6f 63 6b 20 3d 3d 20 2d  ;..if (sock == -
9e20: 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  1) {...Tcl_SetOb
9e30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
9e40: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
9e50: 28 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61  ("unable to crea
9e60: 74 65 20 73 6f 63 6b 65 74 22 2c 20 2d 31 29 29  te socket", -1))
9e70: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  ;....return(TCL_
9e80: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
9e90: 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 09 63  tch (objc) {...c
9ea0: 61 73 65 20 30 3a 0a 09 09 63 61 73 65 20 31 3a  ase 0:...case 1:
9eb0: 20 2f 2a 20 4e 6f 20 61 72 67 75 6d 65 6e 74 73   /* No arguments
9ec0: 2c 20 6c 69 73 74 20 61 6c 6c 20 69 6e 74 65 72  , list all inter
9ed0: 66 61 63 65 73 20 2a 2f 0a 09 09 09 72 65 74 76  faces */....retv
9ee0: 61 6c 20 3d 20 74 75 61 70 69 5f 69 66 63 6f 6e  al = tuapi_ifcon
9ef0: 66 69 67 5f 6c 69 73 74 28 63 64 2c 20 69 6e 74  fig_list(cd, int
9f00: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c  erp, objc, objv,
9f10: 20 73 6f 63 6b 29 3b 0a 0a 09 09 09 62 72 65 61   sock);.....brea
9f20: 6b 3b 0a 09 09 63 61 73 65 20 32 3a 20 2f 2a 20  k;...case 2: /* 
9f30: 4f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 20 67 69  One argument, gi
9f40: 76 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ve information a
9f50: 62 6f 75 74 20 74 68 65 20 69 6e 74 65 72 66 61  bout the interfa
9f60: 63 65 20 2a 2f 0a 09 09 09 72 65 74 76 61 6c 20  ce */....retval 
9f70: 3d 20 74 75 61 70 69 5f 69 66 63 6f 6e 66 69 67  = tuapi_ifconfig
9f80: 5f 69 6e 66 6f 28 63 64 2c 20 69 6e 74 65 72 70  _info(cd, interp
9f90: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f  , objc, objv, so
9fa0: 63 6b 2c 20 73 6f 63 6b 5f 76 34 2c 20 73 6f 63  ck, sock_v4, soc
9fb0: 6b 5f 76 36 29 3b 0a 0a 09 09 09 62 72 65 61 6b  k_v6);.....break
9fc0: 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
9fd0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 63 6f  /* Otherwise, co
9fe0: 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74 65  nfigure the inte
9ff0: 72 61 63 65 20 2a 2f 0a 09 09 09 72 65 74 76 61  race */....retva
a000: 6c 20 3d 20 74 75 61 70 69 5f 69 66 63 6f 6e 66  l = tuapi_ifconf
a010: 69 67 5f 63 6f 6e 66 28 63 64 2c 20 69 6e 74 65  ig_conf(cd, inte
a020: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20  rp, objc, objv, 
a030: 73 6f 63 6b 2c 20 73 6f 63 6b 5f 76 34 2c 20 73  sock, sock_v4, s
a040: 6f 63 6b 5f 76 36 29 3b 0a 0a 09 09 09 62 72 65  ock_v6);.....bre
a050: 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61  ak;..}.../* Clea
a060: 6e 75 70 20 2a 2f 0a 09 69 66 20 28 73 6f 63 6b  nup */..if (sock
a070: 5f 76 34 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63  _v4 != -1) {...c
a080: 6c 6f 73 65 28 73 6f 63 6b 5f 76 34 29 3b 0a 09  lose(sock_v4);..
a090: 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 36 20  }...if (sock_v6 
a0a0: 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 73 65  != -1) {...close
a0b0: 28 73 6f 63 6b 5f 76 36 29 3b 0a 09 7d 0a 0a 09  (sock_v6);..}...
a0c0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
a0d0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75  }..static int tu
a0e0: 61 70 69 5f 72 6f 75 74 65 5f 6c 69 73 74 28 43  api_route_list(C
a0f0: 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63  lientData cd, Tc
a100: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a110: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
a120: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
a130: 5d 2c 20 69 6e 74 20 73 6f 63 6b 5f 76 34 2c 20  ], int sock_v4, 
a140: 69 6e 74 20 73 6f 63 6b 5f 76 36 29 20 7b 0a 09  int sock_v6) {..
a150: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
a160: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
a170: 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74 20 69  StringObj("not i
a180: 6d 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d 31 29  mplemented", -1)
a190: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  );...return(TCL_
a1a0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69  ERROR);.}..stati
a1b0: 63 20 69 6e 74 20 74 75 61 70 69 5f 72 6f 75 74  c int tuapi_rout
a1c0: 65 5f 63 6f 6e 66 28 43 6c 69 65 6e 74 44 61 74  e_conf(ClientDat
a1d0: 61 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  a cd, Tcl_Interp
a1e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
a1f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  jc, Tcl_Obj *CON
a200: 53 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73  ST objv[], int s
a210: 6f 63 6b 5f 76 34 2c 20 69 6e 74 20 73 6f 63 6b  ock_v4, int sock
a220: 5f 76 36 29 20 7b 0a 09 54 63 6c 5f 57 69 64 65  _v6) {..Tcl_Wide
a230: 49 6e 74 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f 77  Int option_val_w
a240: 69 64 65 3b 20 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ide; ..Tcl_Obj *
a250: 6f 70 65 72 61 74 69 6f 6e 5f 6f 62 6a 2c 20 2a  operation_obj, *
a260: 64 65 73 74 5f 6f 62 6a 2c 20 2a 64 65 73 74 6d  dest_obj, *destm
a270: 61 73 6b 5f 6f 62 6a 3b 0a 09 54 63 6c 5f 4f 62  ask_obj;..Tcl_Ob
a280: 6a 20 2a 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f  j *option_name_o
a290: 62 6a 2c 20 2a 6f 70 74 69 6f 6e 5f 76 61 6c 5f  bj, *option_val_
a2a0: 6f 62 6a 3b 0a 09 73 74 72 75 63 74 20 72 74 65  obj;..struct rte
a2b0: 6e 74 72 79 20 72 6f 75 74 65 3b 0a 09 69 6e 74  ntry route;..int
a2c0: 20 73 6f 63 6b 3b 0a 09 69 6e 74 20 69 6f 63 74   sock;..int ioct
a2d0: 6c 5f 69 64 3b 0a 09 69 6e 74 20 74 63 6c 5f 72  l_id;..int tcl_r
a2e0: 65 74 2c 20 69 6f 63 74 6c 5f 72 65 74 2c 20 70  et, ioctl_ret, p
a2f0: 61 72 73 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28  arse_ret;...if (
a300: 6f 62 6a 63 20 3c 20 34 29 20 7b 0a 09 09 54 63  objc < 4) {...Tc
a310: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
a320: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
a330: 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23  ringObj("wrong #
a340: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a350: 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63   \"::tuapi::sysc
a360: 61 6c 6c 3a 3a 72 6f 75 74 65 20 6f 70 65 72 61  all::route opera
a370: 74 69 6f 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e  tion destination
a380: 20 64 65 73 74 69 6e 61 74 69 6f 6e 5f 6d 61 73   destination_mas
a390: 6b 20 3f 6f 70 74 69 6f 6e 73 3f 5c 22 22 2c 20  k ?options?\"", 
a3a0: 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  -1));....return(
a3b0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  TCL_ERROR);..}..
a3c0: 09 2f 2a 20 43 6c 65 61 72 20 6f 62 6a 65 63 74  ./* Clear object
a3d0: 20 76 61 6c 75 65 73 20 2a 2f 0a 09 6d 65 6d 73   values */..mems
a3e0: 65 74 28 26 72 6f 75 74 65 2c 20 30 2c 20 73 69  et(&route, 0, si
a3f0: 7a 65 6f 66 28 72 6f 75 74 65 29 29 3b 0a 0a 09  zeof(route));...
a400: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6f 70 65  /* Determine ope
a410: 72 61 74 69 6f 6e 20 2a 2f 0a 09 6f 70 65 72 61  ration */..opera
a420: 74 69 6f 6e 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b  tion_obj = objv[
a430: 31 5d 3b 0a 09 73 77 69 74 63 68 20 28 74 75 61  1];..switch (tua
a440: 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70  pi_internal_simp
a450: 6c 65 68 61 73 68 5f 6f 62 6a 28 6f 70 65 72 61  lehash_obj(opera
a460: 74 69 6f 6e 5f 6f 62 6a 29 29 20 7b 0a 09 09 63  tion_obj)) {...c
a470: 61 73 65 20 30 78 31 38 37 32 36 34 3a 20 2f 2a  ase 0x187264: /*
a480: 20 61 64 64 20 2a 2f 0a 09 09 09 69 6f 63 74 6c   add */....ioctl
a490: 5f 69 64 20 3d 20 53 49 4f 43 41 44 44 52 54 3b  _id = SIOCADDRT;
a4a0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
a4b0: 65 20 30 78 31 39 33 32 65 63 3a 20 2f 2a 20 64  e 0x1932ec: /* d
a4c0: 65 6c 20 2a 2f 0a 09 09 63 61 73 65 20 30 78 35  el */...case 0x5
a4d0: 64 39 38 65 39 36 35 3a 20 2f 2a 20 64 65 6c 65  d98e965: /* dele
a4e0: 74 65 20 2a 2f 0a 09 09 09 69 6f 63 74 6c 5f 69  te */....ioctl_i
a4f0: 64 20 3d 20 53 49 4f 43 44 45 4c 52 54 3b 0a 09  d = SIOCDELRT;..
a500: 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75  ..break;...defau
a510: 6c 74 3a 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62  lt:....Tcl_SetOb
a520: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
a530: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 62  Tcl_ObjPrintf("b
a540: 61 64 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  ad option \"%s\"
a550: 3a 20 6d 75 73 74 20 62 65 20 61 64 64 2c 20 6f  : must be add, o
a560: 72 20 64 65 6c 65 74 65 22 2c 20 54 63 6c 5f 47  r delete", Tcl_G
a570: 65 74 53 74 72 69 6e 67 28 6f 70 65 72 61 74 69  etString(operati
a580: 6f 6e 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 72  on_obj)));.....r
a590: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
a5a0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 64 65  ;..}.../* Set de
a5b0: 66 61 75 6c 74 20 66 6c 61 67 73 20 2a 2f 0a 09  fault flags */..
a5c0: 72 6f 75 74 65 2e 72 74 5f 66 6c 61 67 73 20 3d  route.rt_flags =
a5d0: 20 52 54 46 5f 55 50 3b 0a 0a 09 2f 2a 20 50 61   RTF_UP;.../* Pa
a5e0: 72 73 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  rse destination 
a5f0: 61 64 64 72 65 73 73 20 2a 2f 0a 09 64 65 73 74  address */..dest
a600: 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  _obj = objv[2];.
a610: 09 70 61 72 73 65 5f 72 65 74 20 3d 20 74 75 61  .parse_ret = tua
a620: 70 69 5f 70 72 69 76 61 74 65 5f 67 65 74 5f 73  pi_private_get_s
a630: 6f 63 6b 61 64 64 72 5f 66 72 6f 6d 5f 6f 62 6a  ockaddr_from_obj
a640: 28 64 65 73 74 5f 6f 62 6a 2c 20 26 72 6f 75 74  (dest_obj, &rout
a650: 65 2e 72 74 5f 64 73 74 29 3b 0a 09 69 66 20 28  e.rt_dst);..if (
a660: 70 61 72 73 65 5f 72 65 74 20 21 3d 20 30 29 20  parse_ret != 0) 
a670: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
a680: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
a690: 5f 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e 61 62  _ObjPrintf("unab
a6a0: 6c 65 20 74 6f 20 70 61 72 73 65 20 5c 22 25 73  le to parse \"%s
a6b0: 5c 22 20 61 73 20 61 6e 20 61 64 64 72 65 73 73  \" as an address
a6c0: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
a6d0: 28 64 65 73 74 5f 6f 62 6a 29 29 29 3b 0a 0a 09  (dest_obj)));...
a6e0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
a6f0: 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 72 73  R);..}.../* Pars
a700: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6e 65  e destination ne
a710: 74 6d 61 73 6b 20 2a 2f 0a 09 64 65 73 74 6d 61  tmask */..destma
a720: 73 6b 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 33 5d  sk_obj = objv[3]
a730: 3b 0a 09 70 61 72 73 65 5f 72 65 74 20 3d 20 74  ;..parse_ret = t
a740: 75 61 70 69 5f 70 72 69 76 61 74 65 5f 67 65 74  uapi_private_get
a750: 5f 73 6f 63 6b 61 64 64 72 5f 66 72 6f 6d 5f 6f  _sockaddr_from_o
a760: 62 6a 28 64 65 73 74 6d 61 73 6b 5f 6f 62 6a 2c  bj(destmask_obj,
a770: 20 26 72 6f 75 74 65 2e 72 74 5f 67 65 6e 6d 61   &route.rt_genma
a780: 73 6b 29 3b 0a 09 69 66 20 28 70 61 72 73 65 5f  sk);..if (parse_
a790: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63  ret != 0) {...Tc
a7a0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
a7b0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
a7c0: 69 6e 74 66 28 22 75 6e 61 62 6c 65 20 74 6f 20  intf("unable to 
a7d0: 70 61 72 73 65 20 5c 22 25 73 5c 22 20 61 73 20  parse \"%s\" as 
a7e0: 61 6e 20 61 64 64 72 65 73 73 22 2c 20 54 63 6c  an address", Tcl
a7f0: 5f 47 65 74 53 74 72 69 6e 67 28 64 65 73 74 6d  _GetString(destm
a800: 61 73 6b 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 72  ask_obj)));....r
a810: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
a820: 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 6f 75 74 65  ;..}...if (route
a830: 2e 72 74 5f 64 73 74 2e 73 61 5f 66 61 6d 69 6c  .rt_dst.sa_famil
a840: 79 20 21 3d 20 72 6f 75 74 65 2e 72 74 5f 67 65  y != route.rt_ge
a850: 6e 6d 61 73 6b 2e 73 61 5f 66 61 6d 69 6c 79 29  nmask.sa_family)
a860: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
a870: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09  esult(interp,...
a880: 20 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28    Tcl_ObjPrintf(
a890: 22 64 65 73 74 69 6e 61 74 69 6f 6e 20 28 5c 22  "destination (\"
a8a0: 25 73 5c 22 29 20 61 6e 64 20 64 65 73 74 69 6e  %s\") and destin
a8b0: 61 74 69 6f 6e 5f 6d 61 73 6b 20 28 5c 22 25 73  ation_mask (\"%s
a8c0: 5c 22 29 20 61 72 65 20 64 69 66 66 65 72 65 6e  \") are differen
a8d0: 74 20 63 6c 61 73 73 65 73 22 2c 0a 09 09 20 20  t classes",...  
a8e0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
a8f0: 64 65 73 74 5f 6f 62 6a 29 2c 0a 09 09 20 20 20  dest_obj),...   
a900: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 64   Tcl_GetString(d
a910: 65 73 74 6d 61 73 6b 5f 6f 62 6a 29 0a 09 09 20  estmask_obj)... 
a920: 20 29 0a 09 09 29 3b 0a 0a 09 09 72 65 74 75 72   )...);....retur
a930: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
a940: 0a 0a 09 73 77 69 74 63 68 20 28 72 6f 75 74 65  ...switch (route
a950: 2e 72 74 5f 64 73 74 2e 73 61 5f 66 61 6d 69 6c  .rt_dst.sa_famil
a960: 79 29 20 7b 0a 09 09 63 61 73 65 20 41 46 5f 49  y) {...case AF_I
a970: 4e 45 54 3a 20 2f 2a 20 49 50 76 34 20 2a 2f 0a  NET: /* IPv4 */.
a980: 09 09 09 69 66 20 28 73 6f 63 6b 5f 76 34 20 3d  ...if (sock_v4 =
a990: 3d 20 2d 31 29 20 7b 0a 09 09 09 09 54 63 6c 5f  = -1) {.....Tcl_
a9a0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
a9b0: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e  erp, Tcl_ObjPrin
a9c0: 74 66 28 22 61 64 64 72 65 73 73 20 5c 22 25 73  tf("address \"%s
a9d0: 5c 22 20 69 73 20 49 50 76 34 2c 20 62 75 74 20  \" is IPv4, but 
a9e0: 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  unable to create
a9f0: 20 49 50 76 34 20 73 6f 63 6b 65 74 22 2c 20 54   IPv4 socket", T
aa00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 64 65 73  cl_GetString(des
aa10: 74 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 09 72  t_obj)));......r
aa20: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
aa30: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28  ;....}.....if ((
aa40: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
aa50: 5f 69 6e 20 2a 29 20 26 72 6f 75 74 65 2e 72 74  _in *) &route.rt
aa60: 5f 67 65 6e 6d 61 73 6b 29 2d 3e 73 69 6e 5f 61  _genmask)->sin_a
aa70: 64 64 72 2e 73 5f 61 64 64 72 20 3d 3d 20 49 4e  ddr.s_addr == IN
aa80: 41 44 44 52 5f 42 52 4f 41 44 43 41 53 54 29 20  ADDR_BROADCAST) 
aa90: 7b 0a 09 09 09 09 72 6f 75 74 65 2e 72 74 5f 66  {.....route.rt_f
aaa0: 6c 61 67 73 20 7c 3d 20 52 54 46 5f 48 4f 53 54  lags |= RTF_HOST
aab0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 6f 63 6b 20  ;....}.....sock 
aac0: 3d 20 73 6f 63 6b 5f 76 34 3b 0a 0a 09 09 09 62  = sock_v4;.....b
aad0: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 46 5f  reak;...case AF_
aae0: 49 4e 45 54 36 3a 20 2f 2a 20 49 50 76 36 20 2a  INET6: /* IPv6 *
aaf0: 2f 0a 09 09 09 69 66 20 28 73 6f 63 6b 5f 76 36  /....if (sock_v6
ab00: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 09 09 54 63   == -1) {.....Tc
ab10: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
ab20: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
ab30: 69 6e 74 66 28 22 61 64 64 72 65 73 73 20 5c 22  intf("address \"
ab40: 25 73 5c 22 20 69 73 20 49 50 76 36 2c 20 62 75  %s\" is IPv6, bu
ab50: 74 20 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61  t unable to crea
ab60: 74 65 20 49 50 76 36 20 73 6f 63 6b 65 74 22 2c  te IPv6 socket",
ab70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 64   Tcl_GetString(d
ab80: 65 73 74 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09  est_obj)));.....
ab90: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
aba0: 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 6f 63  R);....}.....soc
abb0: 6b 20 3d 20 73 6f 63 6b 5f 76 36 3b 0a 0a 09 09  k = sock_v6;....
abc0: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
abd0: 74 3a 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a  t:....Tcl_SetObj
abe0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
abf0: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e  cl_ObjPrintf("un
ac00: 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
ac10: 65 20 74 79 70 65 20 6f 66 20 61 64 64 72 65 73  e type of addres
ac20: 73 20 66 6f 72 20 5c 22 25 73 5c 22 22 2c 20 54  s for \"%s\"", T
ac30: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 64 65 73  cl_GetString(des
ac40: 74 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 72 65  t_obj)));.....re
ac50: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
ac60: 0a 09 7d 0a 0a 09 2f 2a 20 50 61 72 73 65 20 72  ..}.../* Parse r
ac70: 65 6d 61 69 6e 69 6e 67 20 6f 70 74 69 6f 6e 73  emaining options
ac80: 20 2a 2f 0a 09 6f 62 6a 63 20 2d 3d 20 34 3b 0a   */..objc -= 4;.
ac90: 09 6f 62 6a 76 20 2b 3d 20 34 3b 0a 0a 09 66 6f  .objv += 4;...fo
aca0: 72 20 28 3b 20 6f 62 6a 63 20 3e 20 30 3b 20 6f  r (; objc > 0; o
acb0: 62 6a 63 2d 2d 2c 6f 62 6a 76 2b 2b 29 20 7b 0a  bjc--,objv++) {.
acc0: 09 09 6f 70 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62  ..option_name_ob
acd0: 6a 20 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 09 09  j = objv[0];....
ace0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
acf0: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
ad00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
ad10: 4f 62 6a 50 72 69 6e 74 66 28 22 6f 70 74 69 6f  ObjPrintf("optio
ad20: 6e 20 5c 22 25 73 5c 22 20 72 65 71 75 69 72 65  n \"%s\" require
ad30: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 22 2c 20  s an argument", 
ad40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 70  Tcl_GetString(op
ad50: 74 69 6f 6e 5f 6e 61 6d 65 5f 6f 62 6a 29 29 29  tion_name_obj)))
ad60: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c  ;.....return(TCL
ad70: 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09  _ERROR);...}....
ad80: 6f 62 6a 63 2d 2d 3b 0a 09 09 6f 62 6a 76 2b 2b  objc--;...objv++
ad90: 3b 0a 0a 09 09 6f 70 74 69 6f 6e 5f 76 61 6c 5f  ;....option_val_
ada0: 6f 62 6a 20 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 0a  obj = objv[0];..
adb0: 09 09 73 77 69 74 63 68 20 28 74 75 61 70 69 5f  ..switch (tuapi_
adc0: 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70 6c 65 68  internal_simpleh
add0: 61 73 68 5f 6f 62 6a 28 6f 70 74 69 6f 6e 5f 6e  ash_obj(option_n
ade0: 61 6d 65 5f 6f 62 6a 29 29 20 7b 0a 09 09 09 63  ame_obj)) {....c
adf0: 61 73 65 20 30 78 34 63 37 32 37 37 37 39 3a 20  ase 0x4c727779: 
ae00: 2f 2a 20 67 61 74 65 77 61 79 20 2a 2f 0a 09 09  /* gateway */...
ae10: 09 09 70 61 72 73 65 5f 72 65 74 20 3d 20 74 75  ..parse_ret = tu
ae20: 61 70 69 5f 70 72 69 76 61 74 65 5f 67 65 74 5f  api_private_get_
ae30: 73 6f 63 6b 61 64 64 72 5f 66 72 6f 6d 5f 6f 62  sockaddr_from_ob
ae40: 6a 28 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a  j(option_val_obj
ae50: 2c 20 26 72 6f 75 74 65 2e 72 74 5f 67 61 74 65  , &route.rt_gate
ae60: 77 61 79 29 3b 0a 09 09 09 09 69 66 20 28 70 61  way);.....if (pa
ae70: 72 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  rse_ret != 0) {.
ae80: 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52  .....Tcl_SetObjR
ae90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
aea0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 75 6e 61  l_ObjPrintf("una
aeb0: 62 6c 65 20 74 6f 20 70 61 72 73 65 20 5c 22 25  ble to parse \"%
aec0: 73 5c 22 20 61 73 20 61 6e 20 61 64 64 72 65 73  s\" as an addres
aed0: 73 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s", Tcl_GetStrin
aee0: 67 28 6f 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a  g(option_val_obj
aef0: 29 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  )));.......retur
af00: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  n(TCL_ERROR);...
af10: 09 09 7d 0a 0a 09 09 09 09 72 6f 75 74 65 2e 72  ..}......route.r
af20: 74 5f 66 6c 61 67 73 20 26 3d 20 28 7e 52 54 46  t_flags &= (~RTF
af30: 5f 48 4f 53 54 29 3b 0a 09 09 09 09 72 6f 75 74  _HOST);.....rout
af40: 65 2e 72 74 5f 66 6c 61 67 73 20 7c 3d 20 52 54  e.rt_flags |= RT
af50: 46 5f 47 41 54 45 57 41 59 3b 0a 0a 09 09 09 09  F_GATEWAY;......
af60: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
af70: 78 31 62 37 61 37 35 3a 20 2f 2a 20 6d 74 75 20  x1b7a75: /* mtu 
af80: 2a 2f 0a 09 09 09 09 74 63 6c 5f 72 65 74 20 3d  */.....tcl_ret =
af90: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
afa0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
afb0: 70 74 69 6f 6e 5f 76 61 6c 5f 6f 62 6a 2c 20 26  ption_val_obj, &
afc0: 6f 70 74 69 6f 6e 5f 76 61 6c 5f 77 69 64 65 29  option_val_wide)
afd0: 3b 0a 09 09 09 09 69 66 20 28 74 63 6c 5f 72 65  ;.....if (tcl_re
afe0: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
aff0: 09 09 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72  ....return(tcl_r
b000: 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  et);.....}......
b010: 72 6f 75 74 65 2e 72 74 5f 66 6c 61 67 73 20 7c  route.rt_flags |
b020: 3d 20 52 54 46 5f 4d 54 55 3b 0a 09 09 09 09 72  = RTF_MTU;.....r
b030: 6f 75 74 65 2e 72 74 5f 6d 74 75 20 3d 20 6f 70  oute.rt_mtu = op
b040: 74 69 6f 6e 5f 76 61 6c 5f 77 69 64 65 3b 0a 0a  tion_val_wide;..
b050: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
b060: 73 65 20 30 78 35 65 39 64 30 33 65 33 3a 20 2f  se 0x5e9d03e3: /
b070: 2a 20 6d 65 74 72 69 63 20 2a 2f 0a 09 09 09 09  * metric */.....
b080: 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65  tcl_ret = Tcl_Ge
b090: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
b0a0: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 5f 76  interp, option_v
b0b0: 61 6c 5f 6f 62 6a 2c 20 26 6f 70 74 69 6f 6e 5f  al_obj, &option_
b0c0: 76 61 6c 5f 77 69 64 65 29 3b 0a 09 09 09 09 69  val_wide);.....i
b0d0: 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43  f (tcl_ret != TC
b0e0: 4c 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 72 65 74  L_OK) {......ret
b0f0: 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a 09 09  urn(tcl_ret);...
b100: 09 09 7d 0a 0a 09 09 09 09 72 6f 75 74 65 2e 72  ..}......route.r
b110: 74 5f 6d 65 74 72 69 63 20 3d 20 6f 70 74 69 6f  t_metric = optio
b120: 6e 5f 76 61 6c 5f 77 69 64 65 3b 0a 0a 09 09 09  n_val_wide;.....
b130: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
b140: 30 78 39 64 64 38 65 38 66 37 3a 20 2f 2a 20 77  0x9dd8e8f7: /* w
b150: 69 6e 64 6f 77 20 2a 2f 0a 09 09 09 09 74 63 6c  indow */.....tcl
b160: 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 57 69  _ret = Tcl_GetWi
b170: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
b180: 65 72 70 2c 20 6f 70 74 69 6f 6e 5f 76 61 6c 5f  erp, option_val_
b190: 6f 62 6a 2c 20 26 6f 70 74 69 6f 6e 5f 76 61 6c  obj, &option_val
b1a0: 5f 77 69 64 65 29 3b 0a 09 09 09 09 69 66 20 28  _wide);.....if (
b1b0: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
b1c0: 4b 29 20 7b 0a 09 09 09 09 09 72 65 74 75 72 6e  K) {......return
b1d0: 28 74 63 6c 5f 72 65 74 29 3b 0a 09 09 09 09 7d  (tcl_ret);.....}
b1e0: 0a 0a 09 09 09 09 72 6f 75 74 65 2e 72 74 5f 66  ......route.rt_f
b1f0: 6c 61 67 73 20 7c 3d 20 52 54 46 5f 57 49 4e 44  lags |= RTF_WIND
b200: 4f 57 3b 0a 09 09 09 09 72 6f 75 74 65 2e 72 74  OW;.....route.rt
b210: 5f 77 69 6e 64 6f 77 20 3d 20 6f 70 74 69 6f 6e  _window = option
b220: 5f 76 61 6c 5f 77 69 64 65 3b 0a 0a 09 09 09 09  _val_wide;......
b230: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
b240: 78 31 39 33 32 66 36 3a 20 2f 2a 20 64 65 76 20  x1932f6: /* dev 
b250: 2a 2f 0a 09 09 09 63 61 73 65 20 30 78 35 65 64  */....case 0x5ed
b260: 62 65 32 65 35 3a 20 2f 2a 20 64 65 76 69 63 65  be2e5: /* device
b270: 20 2a 2f 0a 09 09 09 09 72 6f 75 74 65 2e 72 74   */.....route.rt
b280: 5f 64 65 76 20 3d 20 73 74 72 64 75 70 28 54 63  _dev = strdup(Tc
b290: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 70 74 69  l_GetString(opti
b2a0: 6f 6e 5f 76 61 6c 5f 6f 62 6a 29 29 3b 0a 0a 09  on_val_obj));...
b2b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
b2c0: 61 75 6c 74 3a 0a 09 09 09 09 54 63 6c 5f 53 65  ault:.....Tcl_Se
b2d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b2e0: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  p, Tcl_ObjPrintf
b2f0: 28 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 25  ("bad option \"%
b300: 73 5c 22 3a 20 6d 75 73 74 20 62 65 20 67 61 74  s\": must be gat
b310: 65 77 61 79 2c 20 6d 74 75 2c 20 6d 65 74 72 69  eway, mtu, metri
b320: 63 2c 20 64 65 76 69 63 65 2c 20 6f 72 20 77 69  c, device, or wi
b330: 6e 64 6f 77 22 2c 20 54 63 6c 5f 47 65 74 53 74  ndow", Tcl_GetSt
b340: 72 69 6e 67 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65  ring(option_name
b350: 5f 6f 62 6a 29 29 29 3b 0a 0a 09 09 09 09 72 65  _obj)));......re
b360: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
b370: 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 52 65 71  ...}..}.../* Req
b380: 75 65 73 74 20 72 6f 75 74 65 20 63 68 61 6e 67  uest route chang
b390: 65 20 2a 2f 0a 09 69 6f 63 74 6c 5f 72 65 74 20  e */..ioctl_ret 
b3a0: 3d 20 69 6f 63 74 6c 28 73 6f 63 6b 2c 20 69 6f  = ioctl(sock, io
b3b0: 63 74 6c 5f 69 64 2c 20 26 72 6f 75 74 65 29 3b  ctl_id, &route);
b3c0: 0a 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20  ..if (ioctl_ret 
b3d0: 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65  != 0) {...Tcl_Se
b3e0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b3f0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
b400: 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72  Obj(strerror(err
b410: 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  no), -1));....re
b420: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
b430: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  ..}...return(TCL
b440: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
b450: 69 6e 74 20 74 75 61 70 69 5f 72 6f 75 74 65 28  int tuapi_route(
b460: 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54  ClientData cd, T
b470: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b480: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
b490: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b4a0: 5b 5d 29 20 7b 0a 09 69 6e 74 20 73 6f 63 6b 5f  []) {..int sock_
b4b0: 76 34 2c 20 73 6f 63 6b 5f 76 36 2c 20 73 6f 63  v4, sock_v6, soc
b4c0: 6b 3b 0a 09 69 6e 74 20 72 65 74 76 61 6c 20 3d  k;..int retval =
b4d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 09 73 6f   TCL_ERROR;...so
b4e0: 63 6b 20 3d 20 74 75 61 70 69 5f 69 6e 74 65 72  ck = tuapi_inter
b4f0: 6e 61 6c 5f 67 65 74 73 6f 63 6b 28 26 73 6f 63  nal_getsock(&soc
b500: 6b 5f 76 34 2c 20 26 73 6f 63 6b 5f 76 36 29 3b  k_v4, &sock_v6);
b510: 0a 09 69 66 20 28 73 6f 63 6b 20 3d 3d 20 2d 31  ..if (sock == -1
b520: 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ) {...Tcl_SetObj
b530: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
b540: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b550: 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74  "unable to creat
b560: 65 20 73 6f 63 6b 65 74 22 2c 20 2d 31 29 29 3b  e socket", -1));
b570: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
b580: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
b590: 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 09 63 61  ch (objc) {...ca
b5a0: 73 65 20 30 3a 0a 09 09 63 61 73 65 20 31 3a 20  se 0:...case 1: 
b5b0: 2f 2a 20 4e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  /* No arguments,
b5c0: 20 6c 69 73 74 20 61 6c 6c 20 69 6e 74 65 72 66   list all interf
b5d0: 61 63 65 73 20 2a 2f 0a 09 09 09 72 65 74 76 61  aces */....retva
b5e0: 6c 20 3d 20 74 75 61 70 69 5f 72 6f 75 74 65 5f  l = tuapi_route_
b5f0: 6c 69 73 74 28 63 64 2c 20 69 6e 74 65 72 70 2c  list(cd, interp,
b600: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63   objc, objv, soc
b610: 6b 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 29 3b 0a  k_v4, sock_v6);.
b620: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
b630: 61 75 6c 74 3a 0a 09 09 09 2f 2a 20 4f 74 68 65  ault:..../* Othe
b640: 72 77 69 73 65 2c 20 6d 6f 64 69 66 79 20 72 6f  rwise, modify ro
b650: 75 74 65 73 20 2a 2f 0a 09 09 09 72 65 74 76 61  utes */....retva
b660: 6c 20 3d 20 74 75 61 70 69 5f 72 6f 75 74 65 5f  l = tuapi_route_
b670: 63 6f 6e 66 28 63 64 2c 20 69 6e 74 65 72 70 2c  conf(cd, interp,
b680: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63   objc, objv, soc
b690: 6b 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 29 3b 0a  k_v4, sock_v6);.
b6a0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
b6b0: 2f 2a 20 43 6c 65 61 6e 75 70 20 2a 2f 0a 09 69  /* Cleanup */..i
b6c0: 66 20 28 73 6f 63 6b 5f 76 34 20 21 3d 20 2d 31  f (sock_v4 != -1
b6d0: 29 20 7b 0a 09 09 63 6c 6f 73 65 28 73 6f 63 6b  ) {...close(sock
b6e0: 5f 76 34 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  _v4);..}...if (s
b6f0: 6f 63 6b 5f 76 36 20 21 3d 20 2d 31 29 20 7b 0a  ock_v6 != -1) {.
b700: 09 09 63 6c 6f 73 65 28 73 6f 63 6b 5f 76 36 29  ..close(sock_v6)
b710: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
b720: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
b730: 20 69 6e 74 20 74 75 61 70 69 5f 62 72 63 74 6c   int tuapi_brctl
b740: 5f 6c 69 73 74 28 43 6c 69 65 6e 74 44 61 74 61  _list(ClientData
b750: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20   cd, Tcl_Interp 
b760: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
b770: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  c, Tcl_Obj *CONS
b780: 54 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 73 6f  T objv[], int so
b790: 63 6b 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62  ck) {..Tcl_SetOb
b7a0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
b7b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b7c0: 28 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65  ("not implemente
b7d0: 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75  d", -1));...retu
b7e0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d  rn(TCL_ERROR);.}
b7f0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61  ..static int tua
b800: 70 69 5f 62 72 63 74 6c 5f 63 6f 6e 66 28 43 6c  pi_brctl_conf(Cl
b810: 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c  ientData cd, Tcl
b820: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b830: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
b840: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
b850: 2c 20 69 6e 74 20 73 6f 63 6b 29 20 7b 0a 09 54  , int sock) {..T
b860: 63 6c 5f 4f 62 6a 20 2a 6f 70 65 72 61 74 69 6f  cl_Obj *operatio
b870: 6e 5f 6f 62 6a 2c 20 2a 62 72 69 64 67 65 5f 6e  n_obj, *bridge_n
b880: 61 6d 65 5f 6f 62 6a 2c 20 2a 69 6e 74 65 72 66  ame_obj, *interf
b890: 61 63 65 5f 6e 61 6d 65 5f 6f 62 6a 3b 0a 09 75  ace_name_obj;..u
b8a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 61 72 67  nsigned long arg
b8b0: 5b 34 5d 3b 0a 09 73 74 72 75 63 74 20 69 66 72  [4];..struct ifr
b8c0: 65 71 20 69 66 72 3b 0a 09 69 6e 74 20 69 6f 63  eq ifr;..int ioc
b8d0: 74 6c 5f 72 65 74 2c 20 69 6f 63 74 6c 5f 69 64  tl_ret, ioctl_id
b8e0: 3b 0a 09 69 6e 74 20 61 64 64 20 3d 20 30 3b 0a  ;..int add = 0;.
b8f0: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6f  ../* Determine o
b900: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 09 6f 70 65  peration */..ope
b910: 72 61 74 69 6f 6e 5f 6f 62 6a 20 3d 20 6f 62 6a  ration_obj = obj
b920: 76 5b 31 5d 3b 0a 09 73 77 69 74 63 68 20 28 74  v[1];..switch (t
b930: 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69  uapi_internal_si
b940: 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28 6f 70 65  mplehash_obj(ope
b950: 72 61 74 69 6f 6e 5f 6f 62 6a 29 29 20 7b 0a 09  ration_obj)) {..
b960: 09 63 61 73 65 20 30 78 31 63 39 39 33 32 37 32  .case 0x1c993272
b970: 3a 20 2f 2a 20 61 64 64 62 72 20 2a 2f 0a 09 09  : /* addbr */...
b980: 09 61 64 64 20 3d 20 31 3b 0a 09 09 63 61 73 65  .add = 1;...case
b990: 20 30 78 34 63 62 62 33 32 37 32 3a 20 2f 2a 20   0x4cbb3272: /* 
b9a0: 64 65 6c 62 72 20 2a 2f 0a 09 09 09 69 66 20 28  delbr */....if (
b9b0: 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 09 09  objc != 3) {....
b9c0: 09 69 66 20 28 61 64 64 29 20 7b 0a 09 09 09 09  .if (add) {.....
b9d0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
b9e0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
b9f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e  wStringObj("wron
ba00: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
ba10: 20 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73   be \"::tuapi::s
ba20: 79 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 20 61 64  yscall::brctl ad
ba30: 64 62 72 20 62 72 69 64 67 65 5c 22 22 2c 20 2d  dbr bridge\"", -
ba40: 31 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  1));.....} else 
ba50: 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74 4f 62  {......Tcl_SetOb
ba60: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
ba70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ba80: 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ("wrong # args: 
ba90: 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75  should be \"::tu
baa0: 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 62 72  api::syscall::br
bab0: 63 74 6c 20 64 65 6c 62 72 20 62 72 69 64 67 65  ctl delbr bridge
bac0: 5c 22 22 2c 20 2d 31 29 29 3b 0a 09 09 09 09 7d  \"", -1));.....}
bad0: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c  ......return(TCL
bae0: 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
baf0: 09 09 62 72 69 64 67 65 5f 6e 61 6d 65 5f 6f 62  ..bridge_name_ob
bb00: 6a 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 0a 09 09  j = objv[2];....
bb10: 09 69 66 20 28 61 64 64 29 20 7b 0a 09 09 09 09  .if (add) {.....
bb20: 61 72 67 5b 30 5d 20 3d 20 42 52 43 54 4c 5f 41  arg[0] = BRCTL_A
bb30: 44 44 5f 42 52 49 44 47 45 3b 0a 09 09 09 7d 20  DD_BRIDGE;....} 
bb40: 65 6c 73 65 20 7b 0a 09 09 09 09 61 72 67 5b 30  else {.....arg[0
bb50: 5d 20 3d 20 42 52 43 54 4c 5f 44 45 4c 5f 42 52  ] = BRCTL_DEL_BR
bb60: 49 44 47 45 3b 0a 09 09 09 7d 0a 0a 09 09 09 61  IDGE;....}.....a
bb70: 72 67 5b 31 5d 20 3d 20 28 75 6e 73 69 67 6e 65  rg[1] = (unsigne
bb80: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 53  d long) Tcl_GetS
bb90: 74 72 69 6e 67 28 62 72 69 64 67 65 5f 6e 61 6d  tring(bridge_nam
bba0: 65 5f 6f 62 6a 29 3b 0a 09 09 09 61 72 67 5b 32  e_obj);....arg[2
bbb0: 5d 20 3d 20 30 3b 0a 0a 09 09 09 69 6f 63 74 6c  ] = 0;.....ioctl
bbc0: 5f 72 65 74 20 3d 20 69 6f 63 74 6c 28 73 6f 63  _ret = ioctl(soc
bbd0: 6b 2c 20 53 49 4f 43 47 49 46 42 52 2c 20 26 61  k, SIOCGIFBR, &a
bbe0: 72 67 29 3b 20 0a 0a 09 09 09 62 72 65 61 6b 3b  rg); .....break;
bbf0: 0a 09 09 63 61 73 65 20 30 78 31 43 39 39 33 37  ...case 0x1C9937
bc00: 45 36 3a 20 2f 2a 20 61 64 64 69 66 20 2a 2f 0a  E6: /* addif */.
bc10: 09 09 09 61 64 64 20 3d 20 31 3b 0a 09 09 63 61  ...add = 1;...ca
bc20: 73 65 20 30 78 34 63 62 62 33 37 65 36 3a 20 2f  se 0x4cbb37e6: /
bc30: 2a 20 64 65 6c 69 66 20 2a 2f 0a 09 09 09 69 66  * delif */....if
bc40: 20 28 6f 62 6a 63 20 21 3d 20 34 29 20 7b 0a 09   (objc != 4) {..
bc50: 09 09 09 69 66 20 28 61 64 64 29 20 7b 0a 09 09  ...if (add) {...
bc60: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
bc70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
bc80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 72  NewStringObj("wr
bc90: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
bca0: 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a  ld be \"::tuapi:
bcb0: 3a 73 79 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 20  :syscall::brctl 
bcc0: 61 64 64 69 66 20 62 72 69 64 67 65 20 69 6e 74  addif bridge int
bcd0: 65 72 66 61 63 65 5c 22 22 2c 20 2d 31 29 29 3b  erface\"", -1));
bce0: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
bcf0: 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
bd00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
bd10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 77 72  NewStringObj("wr
bd20: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
bd30: 6c 64 20 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a  ld be \"::tuapi:
bd40: 3a 73 79 73 63 61 6c 6c 3a 3a 62 72 63 74 6c 20  :syscall::brctl 
bd50: 64 65 6c 69 66 20 62 72 69 64 67 65 20 69 6e 74  delif bridge int
bd60: 65 72 66 61 63 65 5c 22 22 2c 20 2d 31 29 29 3b  erface\"", -1));
bd70: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 72 65 74 75  .....}......retu
bd80: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
bd90: 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 64 64 29  ..}.....if (add)
bda0: 20 7b 0a 09 09 09 09 69 6f 63 74 6c 5f 69 64 20   {.....ioctl_id 
bdb0: 3d 20 53 49 4f 43 42 52 41 44 44 49 46 3b 0a 09  = SIOCBRADDIF;..
bdc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69  ..} else {.....i
bdd0: 6f 63 74 6c 5f 69 64 20 3d 20 53 49 4f 43 42 52  octl_id = SIOCBR
bde0: 44 45 4c 49 46 3b 0a 09 09 09 7d 0a 0a 09 09 09  DELIF;....}.....
bdf0: 62 72 69 64 67 65 5f 6e 61 6d 65 5f 6f 62 6a 20  bridge_name_obj 
be00: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 09 09 69 6e  = objv[2];....in
be10: 74 65 72 66 61 63 65 5f 6e 61 6d 65 5f 6f 62 6a  terface_name_obj
be20: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 0a 09 09 09   = objv[3];.....
be30: 6d 65 6d 73 65 74 28 26 69 66 72 2c 20 30 2c 20  memset(&ifr, 0, 
be40: 73 69 7a 65 6f 66 28 69 66 72 29 29 3b 0a 09 09  sizeof(ifr));...
be50: 09 73 6e 70 72 69 6e 74 66 28 69 66 72 2e 69 66  .snprintf(ifr.if
be60: 72 5f 6e 61 6d 65 2c 20 49 46 4e 41 4d 53 49 5a  r_name, IFNAMSIZ
be70: 2c 20 22 25 73 22 2c 20 54 63 6c 5f 47 65 74 53  , "%s", Tcl_GetS
be80: 74 72 69 6e 67 28 69 6e 74 65 72 66 61 63 65 5f  tring(interface_
be90: 6e 61 6d 65 5f 6f 62 6a 29 29 3b 0a 0a 09 09 09  name_obj));.....
bea0: 69 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74  ioctl_ret = ioct
beb0: 6c 28 73 6f 63 6b 2c 20 53 49 4f 43 47 49 46 49  l(sock, SIOCGIFI
bec0: 4e 44 45 58 2c 20 28 76 6f 69 64 20 2a 29 20 26  NDEX, (void *) &
bed0: 69 66 72 29 3b 0a 09 09 09 69 66 20 28 69 6f 63  ifr);....if (ioc
bee0: 74 6c 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09  tl_ret == 0) {..
bef0: 09 09 09 73 6e 70 72 69 6e 74 66 28 69 66 72 2e  ...snprintf(ifr.
bf00: 69 66 72 5f 6e 61 6d 65 2c 20 49 46 4e 41 4d 53  ifr_name, IFNAMS
bf10: 49 5a 2c 20 22 25 73 22 2c 20 54 63 6c 5f 47 65  IZ, "%s", Tcl_Ge
bf20: 74 53 74 72 69 6e 67 28 62 72 69 64 67 65 5f 6e  tString(bridge_n
bf30: 61 6d 65 5f 6f 62 6a 29 29 3b 0a 09 09 09 09 69  ame_obj));.....i
bf40: 6f 63 74 6c 5f 72 65 74 20 3d 20 69 6f 63 74 6c  octl_ret = ioctl
bf50: 28 73 6f 63 6b 2c 20 69 6f 63 74 6c 5f 69 64 2c  (sock, ioctl_id,
bf60: 20 28 76 6f 69 64 20 2a 29 20 26 69 66 72 29 3b   (void *) &ifr);
bf70: 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
bf80: 0a 09 7d 0a 0a 09 69 66 20 28 69 6f 63 74 6c 5f  ..}...if (ioctl_
bf90: 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 54 63 6c  ret < 0) {...Tcl
bfa0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
bfb0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
bfc0: 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72 28  ingObj(strerror(
bfd0: 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09  errno), -1));...
bfe0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
bff0: 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  R);..}...return(
c000: 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74  TCL_OK);.}..stat
c010: 69 63 20 69 6e 74 20 74 75 61 70 69 5f 62 72 63  ic int tuapi_brc
c020: 74 6c 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64  tl(ClientData cd
c030: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
c040: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
c050: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
c060: 62 6a 76 5b 5d 29 20 7b 0a 09 69 6e 74 20 73 6f  bjv[]) {..int so
c070: 63 6b 5f 76 34 2c 20 73 6f 63 6b 5f 76 36 2c 20  ck_v4, sock_v6, 
c080: 73 6f 63 6b 3b 0a 09 69 6e 74 20 72 65 74 76 61  sock;..int retva
c090: 6c 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  l = TCL_ERROR;..
c0a0: 09 73 6f 63 6b 20 3d 20 74 75 61 70 69 5f 69 6e  .sock = tuapi_in
c0b0: 74 65 72 6e 61 6c 5f 67 65 74 73 6f 63 6b 28 26  ternal_getsock(&
c0c0: 73 6f 63 6b 5f 76 34 2c 20 26 73 6f 63 6b 5f 76  sock_v4, &sock_v
c0d0: 36 29 3b 0a 09 69 66 20 28 73 6f 63 6b 20 3d 3d  6);..if (sock ==
c0e0: 20 2d 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74   -1) {...Tcl_Set
c0f0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
c100: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
c110: 62 6a 28 22 75 6e 61 62 6c 65 20 74 6f 20 63 72  bj("unable to cr
c120: 65 61 74 65 20 73 6f 63 6b 65 74 22 2c 20 2d 31  eate socket", -1
c130: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  ));....return(TC
c140: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
c150: 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09  witch (objc) {..
c160: 09 63 61 73 65 20 30 3a 0a 09 09 63 61 73 65 20  .case 0:...case 
c170: 31 3a 20 2f 2a 20 4e 6f 20 61 72 67 75 6d 65 6e  1: /* No argumen
c180: 74 73 2c 20 6c 69 73 74 20 61 6c 6c 20 62 72 69  ts, list all bri
c190: 64 67 65 73 20 2a 2f 0a 09 09 09 72 65 74 76 61  dges */....retva
c1a0: 6c 20 3d 20 74 75 61 70 69 5f 62 72 63 74 6c 5f  l = tuapi_brctl_
c1b0: 6c 69 73 74 28 63 64 2c 20 69 6e 74 65 72 70 2c  list(cd, interp,
c1c0: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 73 6f 63   objc, objv, soc
c1d0: 6b 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  k);.....break;..
c1e0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 2f 2a 20  .default:..../* 
c1f0: 4f 74 68 65 72 77 69 73 65 2c 20 6d 6f 64 69 66  Otherwise, modif
c200: 79 20 72 6f 75 74 65 73 20 2a 2f 0a 09 09 09 72  y routes */....r
c210: 65 74 76 61 6c 20 3d 20 74 75 61 70 69 5f 62 72  etval = tuapi_br
c220: 63 74 6c 5f 63 6f 6e 66 28 63 64 2c 20 69 6e 74  ctl_conf(cd, int
c230: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c  erp, objc, objv,
c240: 20 73 6f 63 6b 29 3b 0a 0a 09 09 09 62 72 65 61   sock);.....brea
c250: 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 6e  k;..}.../* Clean
c260: 75 70 20 2a 2f 0a 09 69 66 20 28 73 6f 63 6b 5f  up */..if (sock_
c270: 76 34 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c  v4 != -1) {...cl
c280: 6f 73 65 28 73 6f 63 6b 5f 76 34 29 3b 0a 09 7d  ose(sock_v4);..}
c290: 0a 0a 09 69 66 20 28 73 6f 63 6b 5f 76 36 20 21  ...if (sock_v6 !
c2a0: 3d 20 2d 31 29 20 7b 0a 09 09 63 6c 6f 73 65 28  = -1) {...close(
c2b0: 73 6f 63 6b 5f 76 36 29 3b 0a 09 7d 0a 0a 09 72  sock_v6);..}...r
c2c0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
c2d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61  ..static int tua
c2e0: 70 69 5f 76 63 6f 6e 66 69 67 28 43 6c 69 65 6e  pi_vconfig(Clien
c2f0: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
c300: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
c310: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
c320: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
c330: 0a 09 69 6e 74 20 73 6f 63 6b 5f 76 34 2c 20 73  ..int sock_v4, s
c340: 6f 63 6b 5f 76 36 2c 20 73 6f 63 6b 3b 0a 09 69  ock_v6, sock;..i
c350: 6e 74 20 72 65 74 76 61 6c 20 3d 20 54 43 4c 5f  nt retval = TCL_
c360: 45 52 52 4f 52 3b 0a 0a 09 73 6f 63 6b 20 3d 20  ERROR;...sock = 
c370: 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 67  tuapi_internal_g
c380: 65 74 73 6f 63 6b 28 26 73 6f 63 6b 5f 76 34 2c  etsock(&sock_v4,
c390: 20 26 73 6f 63 6b 5f 76 36 29 3b 0a 09 69 66 20   &sock_v6);..if 
c3a0: 28 73 6f 63 6b 20 3d 3d 20 2d 31 29 20 7b 0a 09  (sock == -1) {..
c3b0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
c3c0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
c3d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62  wStringObj("unab
c3e0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 73 6f 63  le to create soc
c3f0: 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72  ket", -1));....r
c400: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
c410: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 53 65 74 4f 62  ;..}...Tcl_SetOb
c420: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c430: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c440: 28 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65  ("not implemente
c450: 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 43  d", -1));.../* C
c460: 6c 65 61 6e 75 70 20 2a 2f 0a 09 69 66 20 28 73  leanup */..if (s
c470: 6f 63 6b 5f 76 34 20 21 3d 20 2d 31 29 20 7b 0a  ock_v4 != -1) {.
c480: 09 09 63 6c 6f 73 65 28 73 6f 63 6b 5f 76 34 29  ..close(sock_v4)
c490: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 5f  ;..}...if (sock_
c4a0: 76 36 20 21 3d 20 2d 31 29 20 7b 0a 09 09 63 6c  v6 != -1) {...cl
c4b0: 6f 73 65 28 73 6f 63 6b 5f 76 36 29 3b 0a 09 7d  ose(sock_v6);..}
c4c0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
c4d0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
c4e0: 20 74 75 61 70 69 5f 73 74 74 79 28 43 6c 69 65   tuapi_stty(Clie
c4f0: 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49  ntData cd, Tcl_I
c500: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
c510: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
c520: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20   *CONST objv[]) 
c530: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 2c  {..Tcl_Obj *obj,
c540: 20 2a 72 65 74 6f 62 6a 20 3d 20 4e 55 4c 4c 3b   *retobj = NULL;
c550: 0a 09 73 74 72 75 63 74 20 74 65 72 6d 69 6f 73  ..struct termios
c560: 20 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d   terminal_inform
c570: 61 74 69 6f 6e 3b 0a 09 73 74 72 75 63 74 20 77  ation;..struct w
c580: 69 6e 73 69 7a 65 20 74 65 72 6d 69 6e 61 6c 5f  insize terminal_
c590: 73 69 7a 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20  size;..unsigned 
c5a0: 6c 6f 6e 67 20 6f 62 6a 5f 68 61 73 68 3b 0a 09  long obj_hash;..
c5b0: 69 6e 74 20 66 64 2c 20 69 64 78 3b 0a 09 69 6e  int fd, idx;..in
c5c0: 74 20 69 6f 63 74 6c 5f 72 65 74 3b 0a 09 69 6e  t ioctl_ret;..in
c5d0: 74 20 72 65 74 76 61 6c 20 3d 20 54 43 4c 5f 4f  t retval = TCL_O
c5e0: 4b 3b 0a 0a 09 66 64 20 3d 20 53 54 44 49 4e 5f  K;...fd = STDIN_
c5f0: 46 49 4c 45 4e 4f 3b 0a 0a 09 66 6f 72 20 28 69  FILENO;...for (i
c600: 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 6f 62  dx = 1; idx < ob
c610: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6f  jc; idx++) {...o
c620: 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a  bj = objv[idx];.
c630: 09 09 6f 62 6a 5f 68 61 73 68 20 3d 20 74 75 61  ..obj_hash = tua
c640: 70 69 5f 69 6e 74 65 72 6e 61 6c 5f 73 69 6d 70  pi_internal_simp
c650: 6c 65 68 61 73 68 5f 6f 62 6a 28 6f 62 6a 29 3b  lehash_obj(obj);
c660: 0a 0a 09 09 73 77 69 74 63 68 20 28 6f 62 6a 5f  ....switch (obj_
c670: 68 61 73 68 29 20 7b 0a 09 09 09 63 61 73 65 20  hash) {....case 
c680: 30 78 65 37 61 37 64 36 35 3a 20 2f 2a 20 73 69  0xe7a7d65: /* si
c690: 7a 65 20 2a 2f 0a 09 09 09 09 69 6f 63 74 6c 5f  ze */.....ioctl_
c6a0: 72 65 74 20 3d 20 69 6f 63 74 6c 28 66 64 2c 20  ret = ioctl(fd, 
c6b0: 54 49 4f 43 47 57 49 4e 53 5a 2c 20 26 74 65 72  TIOCGWINSZ, &ter
c6c0: 6d 69 6e 61 6c 5f 73 69 7a 65 29 3b 0a 09 09 09  minal_size);....
c6d0: 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74 20 21  .if (ioctl_ret !
c6e0: 3d 20 30 29 20 7b 0a 09 09 09 09 09 54 63 6c 5f  = 0) {......Tcl_
c6f0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
c700: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
c710: 6e 67 4f 62 6a 28 22 69 6f 63 74 6c 20 66 61 69  ngObj("ioctl fai
c720: 6c 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  led", -1));.....
c730: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
c740: 4f 52 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  OR);.....}......
c750: 69 66 20 28 72 65 74 6f 62 6a 20 3d 3d 20 4e 55  if (retobj == NU
c760: 4c 4c 29 20 7b 0a 09 09 09 09 09 72 65 74 6f 62  LL) {......retob
c770: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  j = Tcl_NewObj()
c780: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 54 63 6c  ;.....}......Tcl
c790: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
c7a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
c7b0: 74 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  tobj, Tcl_NewLon
c7c0: 67 4f 62 6a 28 74 65 72 6d 69 6e 61 6c 5f 73 69  gObj(terminal_si
c7d0: 7a 65 2e 77 73 5f 72 6f 77 29 29 3b 0a 09 09 09  ze.ws_row));....
c7e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
c7f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
c800: 2c 20 72 65 74 6f 62 6a 2c 20 54 63 6c 5f 4e 65  , retobj, Tcl_Ne
c810: 77 4c 6f 6e 67 4f 62 6a 28 74 65 72 6d 69 6e 61  wLongObj(termina
c820: 6c 5f 73 69 7a 65 2e 77 73 5f 63 6f 6c 29 29 3b  l_size.ws_col));
c830: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
c840: 63 61 73 65 20 30 78 35 62 63 62 30 66 37 3a 20  case 0x5bcb0f7: 
c850: 2f 2a 20 2d 72 61 77 20 2a 2f 0a 09 09 09 63 61  /* -raw */....ca
c860: 73 65 20 30 78 31 63 62 30 66 37 3a 20 2f 2a 20  se 0x1cb0f7: /* 
c870: 72 61 77 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  raw */....case 0
c880: 78 64 63 62 38 66 35 36 66 3a 20 2f 2a 20 2d 65  xdcb8f56f: /* -e
c890: 63 68 6f 20 2a 2f 0a 09 09 09 63 61 73 65 20 30  cho */....case 0
c8a0: 78 63 62 38 66 34 36 66 3a 20 2f 2a 20 65 63 68  xcb8f46f: /* ech
c8b0: 6f 20 2a 2f 0a 09 09 09 09 69 6f 63 74 6c 5f 72  o */.....ioctl_r
c8c0: 65 74 20 3d 20 69 6f 63 74 6c 28 66 64 2c 20 54  et = ioctl(fd, T
c8d0: 43 47 45 54 53 2c 20 26 74 65 72 6d 69 6e 61 6c  CGETS, &terminal
c8e0: 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 29 3b 0a 09  _information);..
c8f0: 09 09 09 69 66 20 28 69 6f 63 74 6c 5f 72 65 74  ...if (ioctl_ret
c900: 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 54 63   != 0) {......Tc
c910: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c920: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
c930: 72 69 6e 67 4f 62 6a 28 22 69 6f 63 74 6c 20 66  ringObj("ioctl f
c940: 61 69 6c 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09  ailed", -1));...
c950: 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
c960: 52 52 4f 52 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  RROR);.....}....
c970: 09 09 73 77 69 74 63 68 20 28 6f 62 6a 5f 68 61  ..switch (obj_ha
c980: 73 68 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20  sh) {......case 
c990: 30 78 35 62 63 62 30 66 37 3a 20 2f 2a 20 2d 72  0x5bcb0f7: /* -r
c9a0: 61 77 20 2a 2f 0a 09 09 09 09 09 09 74 65 72 6d  aw */.......term
c9b0: 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e  inal_information
c9c0: 2e 63 5f 69 66 6c 61 67 20 7c 3d 20 42 52 4b 49  .c_iflag |= BRKI
c9d0: 4e 54 20 7c 20 49 47 4e 50 41 52 20 7c 20 49 53  NT | IGNPAR | IS
c9e0: 54 52 49 50 20 7c 20 49 43 52 4e 4c 20 7c 20 49  TRIP | ICRNL | I
c9f0: 58 4f 4e 3b 0a 09 09 09 09 09 09 74 65 72 6d 69  XON;.......termi
ca00: 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal_information.
ca10: 63 5f 6f 66 6c 61 67 20 7c 3d 20 4f 50 4f 53 54  c_oflag |= OPOST
ca20: 3b 0a 09 09 09 09 09 09 74 65 72 6d 69 6e 61 6c  ;.......terminal
ca30: 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f 6c  _information.c_l
ca40: 66 6c 61 67 20 7c 3d 20 49 53 49 47 20 7c 20 49  flag |= ISIG | I
ca50: 43 41 4e 4f 4e 3b 0a 23 69 66 20 56 4d 49 4e 20  CANON;.#if VMIN 
ca60: 3d 3d 20 56 45 4f 46 0a 09 09 09 09 09 09 74 65  == VEOF.......te
ca70: 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69  rminal_informati
ca80: 6f 6e 2e 63 5f 63 63 5b 56 45 4f 46 5d 20 3d 20  on.c_cc[VEOF] = 
ca90: 43 45 4f 46 3b 0a 23 65 6e 64 69 66 0a 23 69 66  CEOF;.#endif.#if
caa0: 20 56 54 49 4d 45 20 3d 3d 20 56 45 4f 4c 0a 09   VTIME == VEOL..
cab0: 09 09 09 09 09 74 65 72 6d 69 6e 61 6c 5f 69 6e  .....terminal_in
cac0: 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f 63 63 5b 56  formation.c_cc[V
cad0: 45 4f 4c 5d 20 3d 20 43 45 4f 4c 3b 0a 23 65 6e  EOL] = CEOL;.#en
cae0: 64 69 66 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  dif.......break;
caf0: 0a 09 09 09 09 09 63 61 73 65 20 30 78 31 63 62  ......case 0x1cb
cb00: 30 66 37 3a 20 2f 2a 20 72 61 77 20 2a 2f 0a 09  0f7: /* raw */..
cb10: 09 09 09 09 09 74 65 72 6d 69 6e 61 6c 5f 69 6e  .....terminal_in
cb20: 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f 69 66 6c 61  formation.c_ifla
cb30: 67 20 26 3d 20 7e 28 49 47 4e 42 52 4b 20 7c 20  g &= ~(IGNBRK | 
cb40: 42 52 4b 49 4e 54 20 7c 20 50 41 52 4d 52 4b 20  BRKINT | PARMRK 
cb50: 7c 20 49 53 54 52 49 50 20 7c 20 49 4e 4c 43 52  | ISTRIP | INLCR
cb60: 20 7c 20 49 47 4e 43 52 20 7c 20 49 43 52 4e 4c   | IGNCR | ICRNL
cb70: 20 7c 20 49 58 4f 4e 29 3b 0a 09 09 09 09 09 09   | IXON);.......
cb80: 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61  terminal_informa
cb90: 74 69 6f 6e 2e 63 5f 6f 66 6c 61 67 20 26 3d 20  tion.c_oflag &= 
cba0: 7e 4f 50 4f 53 54 3b 0a 09 09 09 09 09 09 74 65  ~OPOST;.......te
cbb0: 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69  rminal_informati
cbc0: 6f 6e 2e 63 5f 6c 66 6c 61 67 20 26 3d 20 7e 28  on.c_lflag &= ~(
cbd0: 49 53 49 47 20 7c 20 49 43 41 4e 4f 4e 29 3b 0a  ISIG | ICANON);.
cbe0: 09 09 09 09 09 09 74 65 72 6d 69 6e 61 6c 5f 69  ......terminal_i
cbf0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f 63 63 5b  nformation.c_cc[
cc00: 56 4d 49 4e 5d 20 3d 20 31 3b 0a 09 09 09 09 09  VMIN] = 1;......
cc10: 09 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f 72 6d  .terminal_inform
cc20: 61 74 69 6f 6e 2e 63 5f 63 63 5b 56 54 49 4d 45  ation.c_cc[VTIME
cc30: 5d 20 3d 20 30 3b 0a 09 09 09 09 09 09 62 72 65  ] = 0;.......bre
cc40: 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 30 78  ak;......case 0x
cc50: 64 63 62 38 66 35 36 66 3a 20 2f 2a 20 2d 65 63  dcb8f56f: /* -ec
cc60: 68 6f 20 2a 2f 0a 09 09 09 09 09 09 74 65 72 6d  ho */.......term
cc70: 69 6e 61 6c 5f 69 6e 66 6f 72 6d 61 74 69 6f 6e  inal_information
cc80: 2e 63 5f 6c 66 6c 61 67 20 26 3d 20 7e 45 43 48  .c_lflag &= ~ECH
cc90: 4f 3b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  O;.......break;.
cca0: 09 09 09 09 09 63 61 73 65 20 30 78 63 62 38 66  .....case 0xcb8f
ccb0: 34 36 66 3a 20 2f 2a 20 65 63 68 6f 20 2a 2f 0a  46f: /* echo */.
ccc0: 09 09 09 09 09 09 74 65 72 6d 69 6e 61 6c 5f 69  ......terminal_i
ccd0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 63 5f 6c 66 6c  nformation.c_lfl
cce0: 61 67 20 7c 3d 20 45 43 48 4f 3b 0a 09 09 09 09  ag |= ECHO;.....
ccf0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
cd00: 09 09 09 09 69 6f 63 74 6c 5f 72 65 74 20 3d 20  ....ioctl_ret = 
cd10: 69 6f 63 74 6c 28 66 64 2c 20 54 43 53 45 54 53  ioctl(fd, TCSETS
cd20: 2c 20 26 74 65 72 6d 69 6e 61 6c 5f 69 6e 66 6f  , &terminal_info
cd30: 72 6d 61 74 69 6f 6e 29 3b 0a 09 09 09 09 69 66  rmation);.....if
cd40: 20 28 69 6f 63 74 6c 5f 72 65 74 20 21 3d 20 30   (ioctl_ret != 0
cd50: 29 20 7b 0a 09 09 09 09 09 54 63 6c 5f 53 65 74  ) {......Tcl_Set
cd60: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
cd70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
cd80: 62 6a 28 22 69 6f 63 74 6c 20 66 61 69 6c 65 64  bj("ioctl failed
cd90: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 09 72  ", -1));.......r
cda0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
cdb0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 62 72 65  ;.....}......bre
cdc0: 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a  ak;....default:.
cdd0: 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ....Tcl_SetObjRe
cde0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
cdf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
ce00: 75 62 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 69 6d  ubcommand not im
ce10: 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d 31 29 29  plemented", -1))
ce20: 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c  ;.....return(TCL
ce30: 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
ce40: 0a 09 69 66 20 28 72 65 74 6f 62 6a 20 21 3d 20  ..if (retobj != 
ce50: 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65  NULL) {...Tcl_Se
ce60: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ce70: 70 2c 20 72 65 74 6f 62 6a 29 3b 0a 09 7d 0a 0a  p, retobj);..}..
ce80: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
ce90: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
cea0: 75 61 70 69 5f 72 6c 69 6d 69 74 28 43 6c 69 65  uapi_rlimit(Clie
ceb0: 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49  ntData cd, Tcl_I
cec0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
ced0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
cee0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20   *CONST objv[]) 
cef0: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 70 65 72  {..Tcl_Obj *oper
cf00: 61 74 69 6f 6e 5f 6f 62 6a 2c 20 2a 72 65 73 6f  ation_obj, *reso
cf10: 75 72 63 65 5f 69 64 5f 6f 62 6a 2c 20 2a 72 65  urce_id_obj, *re
cf20: 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 5f  source_val_item_
cf30: 6f 62 6a 2c 20 2a 72 65 73 6f 75 72 63 65 5f 76  obj, *resource_v
cf40: 61 6c 5f 69 74 65 6d 76 61 6c 5f 6f 62 6a 2c 20  al_itemval_obj, 
cf50: 2a 72 65 74 5f 6f 62 6a 3b 0a 09 73 74 72 75 63  *ret_obj;..struc
cf60: 74 20 72 6c 69 6d 69 74 20 72 65 73 6f 75 72 63  t rlimit resourc
cf70: 65 5f 76 61 6c 3b 0a 09 54 63 6c 5f 57 69 64 65  e_val;..Tcl_Wide
cf80: 49 6e 74 20 72 65 73 6f 75 72 63 65 5f 76 61 6c  Int resource_val
cf90: 5f 69 74 65 6d 3b 0a 09 69 6e 74 20 72 65 73 6f  _item;..int reso
cfa0: 75 72 63 65 5f 69 64 3b 0a 09 69 6e 74 20 72 6c  urce_id;..int rl
cfb0: 69 6d 69 74 5f 72 65 74 2c 20 74 63 6c 5f 72 65  imit_ret, tcl_re
cfc0: 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 3c 20  t;...if (objc < 
cfd0: 33 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  3) {...Tcl_SetOb
cfe0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
cff0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
d000: 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ("wrong # args: 
d010: 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74 75  should be \"::tu
d020: 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 72 6c  api::syscall::rl
d030: 69 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 20 72  imit operation r
d040: 65 73 6f 75 72 63 65 20 3f 76 61 6c 75 65 3f 5c  esource ?value?\
d050: 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74  "", -1));....ret
d060: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
d070: 09 7d 0a 0a 09 6f 70 65 72 61 74 69 6f 6e 5f 6f  .}...operation_o
d080: 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 09 72  bj = objv[1];..r
d090: 65 73 6f 75 72 63 65 5f 69 64 5f 6f 62 6a 20 3d  esource_id_obj =
d0a0: 20 6f 62 6a 76 5b 32 5d 3b 0a 0a 09 73 77 69 74   objv[2];...swit
d0b0: 63 68 20 28 74 75 61 70 69 5f 69 6e 74 65 72 6e  ch (tuapi_intern
d0c0: 61 6c 5f 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62  al_simplehash_ob
d0d0: 6a 28 72 65 73 6f 75 72 63 65 5f 69 64 5f 6f 62  j(resource_id_ob
d0e0: 6a 29 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32  j)) {...case 0x2
d0f0: 30 64 33 4c 55 3a 20 2f 2a 20 41 53 20 2a 2f 0a  0d3LU: /* AS */.
d100: 09 09 09 72 65 73 6f 75 72 63 65 5f 69 64 20 3d  ...resource_id =
d110: 20 52 4c 49 4d 49 54 5f 41 53 3b 0a 09 09 09 62   RLIMIT_AS;....b
d120: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 30 78 38  reak;...case 0x8
d130: 37 33 65 39 34 35 4c 55 3a 20 2f 2a 20 43 4f 52  73e945LU: /* COR
d140: 45 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72 63 65  E */....resource
d150: 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f 43 4f 52  _id = RLIMIT_COR
d160: 45 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  E;....break;...c
d170: 61 73 65 20 30 78 31 30 65 38 35 35 4c 55 3a 20  ase 0x10e855LU: 
d180: 2f 2a 20 43 50 55 20 2a 2f 0a 09 09 09 72 65 73  /* CPU */....res
d190: 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49  ource_id = RLIMI
d1a0: 54 5f 43 50 55 3b 0a 09 09 09 62 72 65 61 6b 3b  T_CPU;....break;
d1b0: 0a 09 09 63 61 73 65 20 30 78 38 39 30 36 61 34  ...case 0x8906a4
d1c0: 31 4c 55 3a 20 2f 2a 20 44 41 54 41 20 2a 2f 0a  1LU: /* DATA */.
d1d0: 09 09 09 72 65 73 6f 75 72 63 65 5f 69 64 20 3d  ...resource_id =
d1e0: 20 52 4c 49 4d 49 54 5f 44 41 54 41 3b 0a 09 09   RLIMIT_DATA;...
d1f0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 30  .break;...case 0
d200: 78 36 61 37 32 36 66 34 35 4c 55 3a 20 2f 2a 20  x6a726f45LU: /* 
d210: 46 53 49 5a 45 20 2a 2f 0a 09 09 09 72 65 73 6f  FSIZE */....reso
d220: 75 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54  urce_id = RLIMIT
d230: 5f 46 53 49 5a 45 3b 0a 09 09 09 62 72 65 61 6b  _FSIZE;....break
d240: 3b 0a 23 69 66 64 65 66 20 52 4c 49 4d 49 54 5f  ;.#ifdef RLIMIT_
d250: 4c 4f 43 4b 53 0a 09 09 63 61 73 65 20 30 78 63  LOCKS...case 0xc
d260: 39 66 30 65 37 64 33 4c 55 3a 20 2f 2a 20 4c 4f  9f0e7d3LU: /* LO
d270: 43 4b 53 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72  CKS */....resour
d280: 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f 4c  ce_id = RLIMIT_L
d290: 4f 43 4b 53 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  OCKS;....break;.
d2a0: 23 65 6e 64 69 66 0a 09 09 63 61 73 65 20 30 78  #endif...case 0x
d2b0: 64 39 30 38 66 37 63 62 4c 55 3a 20 2f 2a 20 4d  d908f7cbLU: /* M
d2c0: 45 4d 4c 4f 43 4b 20 2a 2f 0a 09 09 09 72 65 73  EMLOCK */....res
d2d0: 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49  ource_id = RLIMI
d2e0: 54 5f 4d 45 4d 4c 4f 43 4b 3b 0a 09 09 09 62 72  T_MEMLOCK;....br
d2f0: 65 61 6b 3b 0a 23 69 66 64 65 66 20 52 4c 49 4d  eak;.#ifdef RLIM
d300: 49 54 5f 4d 53 47 51 55 45 55 45 0a 09 09 63 61  IT_MSGQUEUE...ca
d310: 73 65 20 30 78 35 37 31 36 37 34 34 35 4c 55 3a  se 0x57167445LU:
d320: 20 2f 2a 20 4d 53 47 51 55 45 55 45 20 2a 2f 0a   /* MSGQUEUE */.
d330: 09 09 09 72 65 73 6f 75 72 63 65 5f 69 64 20 3d  ...resource_id =
d340: 20 52 4c 49 4d 49 54 5f 4d 53 47 51 55 45 55 45   RLIMIT_MSGQUEUE
d350: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ;....break;.#end
d360: 69 66 0a 09 09 63 61 73 65 20 30 78 39 64 32 36  if...case 0x9d26
d370: 31 63 35 4c 55 3a 20 2f 2a 20 4e 49 43 45 20 2a  1c5LU: /* NICE *
d380: 2f 0a 09 09 09 72 65 73 6f 75 72 63 65 5f 69 64  /....resource_id
d390: 20 3d 20 52 4c 49 4d 49 54 5f 4e 49 43 45 3b 0a   = RLIMIT_NICE;.
d3a0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
d3b0: 20 30 78 66 38 64 33 35 63 34 35 4c 55 3a 20 2f   0xf8d35c45LU: /
d3c0: 2a 20 4e 4f 46 49 4c 45 20 2a 2f 0a 09 09 63 61  * NOFILE */...ca
d3d0: 73 65 20 30 78 66 38 64 32 36 34 34 35 4c 55 3a  se 0xf8d26445LU:
d3e0: 20 2f 2a 20 4f 46 49 4c 45 20 2a 2f 0a 09 09 09   /* OFILE */....
d3f0: 72 65 73 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c  resource_id = RL
d400: 49 4d 49 54 5f 4e 4f 46 49 4c 45 3b 0a 09 09 09  IMIT_NOFILE;....
d410: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 30 78  break;...case 0x
d420: 65 61 31 34 61 35 63 33 4c 55 3a 20 2f 2a 20 4e  ea14a5c3LU: /* N
d430: 50 52 4f 43 20 2a 2f 0a 09 09 09 72 65 73 6f 75  PROC */....resou
d440: 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49 54 5f  rce_id = RLIMIT_
d450: 4e 50 52 4f 43 3b 0a 09 09 09 62 72 65 61 6b 3b  NPROC;....break;
d460: 0a 09 09 63 61 73 65 20 30 78 31 34 61 39 64 33  ...case 0x14a9d3
d470: 4c 55 3a 20 2f 2a 20 52 53 53 20 2a 2f 0a 09 09  LU: /* RSS */...
d480: 09 72 65 73 6f 75 72 63 65 5f 69 64 20 3d 20 52  .resource_id = R
d490: 4c 49 4d 49 54 5f 52 53 53 3b 0a 09 09 09 62 72  LIMIT_RSS;....br
d4a0: 65 61 6b 3b 0a 23 69 66 64 65 66 20 52 4c 49 4d  eak;.#ifdef RLIM
d4b0: 49 54 5f 52 54 50 52 49 4f 0a 09 09 63 61 73 65  IT_RTPRIO...case
d4c0: 20 30 78 34 61 31 35 65 65 34 66 4c 55 3a 20 2f   0x4a15ee4fLU: /
d4d0: 2a 20 52 54 50 52 49 4f 20 2a 2f 0a 09 09 09 72  * RTPRIO */....r
d4e0: 65 73 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c 49  esource_id = RLI
d4f0: 4d 49 54 5f 52 54 50 52 49 4f 3b 0a 09 09 09 62  MIT_RTPRIO;....b
d500: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
d510: 64 65 66 20 52 4c 49 4d 49 54 5f 52 54 54 49 4d  def RLIMIT_RTTIM
d520: 45 0a 09 09 63 61 73 65 20 30 78 34 61 39 33 32  E...case 0x4a932
d530: 63 34 35 4c 55 3a 20 2f 2a 20 52 54 54 49 4d 45  c45LU: /* RTTIME
d540: 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72 63 65 5f   */....resource_
d550: 69 64 20 3d 20 52 4c 49 4d 49 54 5f 52 54 54 49  id = RLIMIT_RTTI
d560: 4d 45 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65  ME;....break;.#e
d570: 6e 64 69 66 0a 23 69 66 64 65 66 20 52 4c 49 4d  ndif.#ifdef RLIM
d580: 49 54 5f 53 49 47 50 45 4e 44 49 4e 47 0a 09 09  IT_SIGPENDING...
d590: 63 61 73 65 20 30 78 32 66 33 39 30 33 34 37 4c  case 0x2f390347L
d5a0: 55 3a 20 2f 2a 20 53 49 47 50 45 4e 44 49 4e 47  U: /* SIGPENDING
d5b0: 20 2a 2f 0a 09 09 09 72 65 73 6f 75 72 63 65 5f   */....resource_
d5c0: 69 64 20 3d 20 52 4c 49 4d 49 54 5f 53 49 47 50  id = RLIMIT_SIGP
d5d0: 45 4e 44 49 4e 47 3b 0a 09 09 09 62 72 65 61 6b  ENDING;....break
d5e0: 3b 0a 23 65 6e 64 69 66 0a 09 09 63 61 73 65 20  ;.#endif...case 
d5f0: 30 78 33 61 39 30 36 33 34 62 4c 55 3a 20 2f 2a  0x3a90634bLU: /*
d600: 20 53 54 41 43 4b 20 2a 2f 0a 09 09 09 72 65 73   STACK */....res
d610: 6f 75 72 63 65 5f 69 64 20 3d 20 52 4c 49 4d 49  ource_id = RLIMI
d620: 54 5f 53 54 41 43 4b 3b 0a 09 09 09 62 72 65 61  T_STACK;....brea
d630: 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  k;...default:...
d640: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
d650: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
d660: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 76 61  wStringObj("inva
d670: 6c 69 64 20 72 65 73 6f 75 72 63 65 22 2c 20 2d  lid resource", -
d680: 31 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  1));.....return(
d690: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  TCL_ERROR);..}..
d6a0: 09 69 66 20 28 73 74 72 63 6d 70 28 54 63 6c 5f  .if (strcmp(Tcl_
d6b0: 47 65 74 53 74 72 69 6e 67 28 6f 70 65 72 61 74  GetString(operat
d6c0: 69 6f 6e 5f 6f 62 6a 29 2c 20 22 67 65 74 22 29  ion_obj), "get")
d6d0: 20 3d 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 6f   == 0) {...if (o
d6e0: 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 09 09 54  bjc != 3) {....T
d6f0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
d700: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
d710: 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20  tringObj("wrong 
d720: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
d730: 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  e \"::tuapi::sys
d740: 63 61 6c 6c 3a 3a 72 6c 69 6d 69 74 20 67 65 74  call::rlimit get
d750: 20 72 65 73 6f 75 72 63 65 5c 22 22 2c 20 2d 31   resource\"", -1
d760: 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 54  ));.....return(T
d770: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a  CL_ERROR);...}..
d780: 09 09 72 6c 69 6d 69 74 5f 72 65 74 20 3d 20 67  ..rlimit_ret = g
d790: 65 74 72 6c 69 6d 69 74 28 72 65 73 6f 75 72 63  etrlimit(resourc
d7a0: 65 5f 69 64 2c 20 26 72 65 73 6f 75 72 63 65 5f  e_id, &resource_
d7b0: 76 61 6c 29 3b 0a 09 09 69 66 20 28 72 6c 69 6d  val);...if (rlim
d7c0: 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
d7d0: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
d7e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
d7f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 67 65 74  ewStringObj("get
d800: 72 6c 69 6d 69 74 28 29 20 66 61 69 6c 65 64 22  rlimit() failed"
d810: 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74 75  , -1));.....retu
d820: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
d830: 09 7d 0a 0a 09 09 72 65 74 5f 6f 62 6a 20 3d 20  .}....ret_obj = 
d840: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 09  Tcl_NewObj();...
d850: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
d860: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
d870: 20 72 65 74 5f 6f 62 6a 2c 20 54 63 6c 5f 4e 65   ret_obj, Tcl_Ne
d880: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6f 66 74  wStringObj("soft
d890: 22 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c 5f 4c  ", -1));...Tcl_L
d8a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
d8b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 74 5f  ent(interp, ret_
d8c0: 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  obj, Tcl_NewWide
d8d0: 49 6e 74 4f 62 6a 28 72 65 73 6f 75 72 63 65 5f  IntObj(resource_
d8e0: 76 61 6c 2e 72 6c 69 6d 5f 63 75 72 29 29 3b 0a  val.rlim_cur));.
d8f0: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
d900: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
d910: 70 2c 20 72 65 74 5f 6f 62 6a 2c 20 54 63 6c 5f  p, ret_obj, Tcl_
d920: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 61  NewStringObj("ha
d930: 72 64 22 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c  rd", -1));...Tcl
d940: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
d950: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
d960: 74 5f 6f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69  t_obj, Tcl_NewWi
d970: 64 65 49 6e 74 4f 62 6a 28 72 65 73 6f 75 72 63  deIntObj(resourc
d980: 65 5f 76 61 6c 2e 72 6c 69 6d 5f 6d 61 78 29 29  e_val.rlim_max))
d990: 3b 0a 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52  ;....Tcl_SetObjR
d9a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65  esult(interp, re
d9b0: 74 5f 6f 62 6a 29 3b 0a 0a 09 09 72 65 74 75 72  t_obj);....retur
d9c0: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(TCL_OK);..}...
d9d0: 69 66 20 28 73 74 72 63 6d 70 28 54 63 6c 5f 47  if (strcmp(Tcl_G
d9e0: 65 74 53 74 72 69 6e 67 28 6f 70 65 72 61 74 69  etString(operati
d9f0: 6f 6e 5f 6f 62 6a 29 2c 20 22 73 65 74 22 29 20  on_obj), "set") 
da00: 3d 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 6f 62  == 0) {...if (ob
da10: 6a 63 20 21 3d 20 34 29 20 7b 0a 09 09 09 54 63  jc != 4) {....Tc
da20: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
da30: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
da40: 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23  ringObj("wrong #
da50: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
da60: 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63   \"::tuapi::sysc
da70: 61 6c 6c 3a 3a 72 6c 69 6d 69 74 20 73 65 74 20  all::rlimit set 
da80: 72 65 73 6f 75 72 63 65 20 76 61 6c 75 65 5c 22  resource value\"
da90: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 72 65 74  ", -1));.....ret
daa0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
dab0: 09 09 7d 0a 0a 09 09 72 65 73 6f 75 72 63 65 5f  ..}....resource_
dac0: 76 61 6c 5f 69 74 65 6d 5f 6f 62 6a 20 3d 20 6f  val_item_obj = o
dad0: 62 6a 76 5b 33 5d 3b 0a 0a 09 09 2f 2a 20 44 65  bjv[3];..../* De
dae0: 74 65 72 6d 69 6e 65 20 69 66 20 77 65 20 77 65  termine if we we
daf0: 72 65 20 61 73 6b 65 64 20 74 6f 20 73 65 74 20  re asked to set 
db00: 74 6f 20 61 20 73 69 6d 70 6c 65 20 76 61 6c 75  to a simple valu
db10: 65 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  e, in which case
db20: 20 73 65 74 20 62 6f 74 68 20 68 61 72 64 20 61   set both hard a
db30: 6e 64 20 73 6f 66 74 20 6c 69 6d 69 74 73 20 2a  nd soft limits *
db40: 2f 0a 09 09 74 63 6c 5f 72 65 74 20 3d 20 54 63  /...tcl_ret = Tc
db50: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
db60: 4f 62 6a 28 4e 55 4c 4c 2c 20 72 65 73 6f 75 72  Obj(NULL, resour
db70: 63 65 5f 76 61 6c 5f 69 74 65 6d 5f 6f 62 6a 2c  ce_val_item_obj,
db80: 20 26 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69   &resource_val_i
db90: 74 65 6d 29 3b 0a 09 09 69 66 20 28 74 63 6c 5f  tem);...if (tcl_
dba0: 72 65 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ret == TCL_OK) {
dbb0: 0a 09 09 09 72 65 73 6f 75 72 63 65 5f 76 61 6c  ....resource_val
dbc0: 2e 72 6c 69 6d 5f 63 75 72 20 3d 20 72 65 73 6f  .rlim_cur = reso
dbd0: 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 3b 0a 09  urce_val_item;..
dbe0: 09 09 72 65 73 6f 75 72 63 65 5f 76 61 6c 2e 72  ..resource_val.r
dbf0: 6c 69 6d 5f 6d 61 78 20 3d 20 72 65 73 6f 75 72  lim_max = resour
dc00: 63 65 5f 76 61 6c 5f 69 74 65 6d 3b 0a 09 09 7d  ce_val_item;...}
dc10: 20 65 6c 73 65 20 7b 0a 09 09 09 74 63 6c 5f 72   else {....tcl_r
dc20: 65 74 20 3d 20 54 63 6c 5f 44 69 63 74 4f 62 6a  et = Tcl_DictObj
dc30: 47 65 74 28 4e 55 4c 4c 2c 20 72 65 73 6f 75 72  Get(NULL, resour
dc40: 63 65 5f 76 61 6c 5f 69 74 65 6d 5f 6f 62 6a 2c  ce_val_item_obj,
dc50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
dc60: 6a 28 22 73 6f 66 74 22 2c 20 2d 31 29 2c 20 26  j("soft", -1), &
dc70: 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65  resource_val_ite
dc80: 6d 76 61 6c 5f 6f 62 6a 29 3b 0a 09 09 09 69 66  mval_obj);....if
dc90: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
dca0: 5f 4f 4b 29 20 7b 0a 09 09 09 09 54 63 6c 5f 53  _OK) {.....Tcl_S
dcb0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
dcc0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
dcd0: 67 4f 62 6a 28 22 69 6e 76 61 6c 69 64 20 72 65  gObj("invalid re
dce0: 71 75 65 73 74 22 2c 20 2d 31 29 29 3b 0a 0a 09  quest", -1));...
dcf0: 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
dd00: 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 74  ROR);....}.....t
dd10: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 47 65 74  cl_ret = Tcl_Get
dd20: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 4e  WideIntFromObj(N
dd30: 55 4c 4c 2c 20 72 65 73 6f 75 72 63 65 5f 76 61  ULL, resource_va
dd40: 6c 5f 69 74 65 6d 76 61 6c 5f 6f 62 6a 2c 20 26  l_itemval_obj, &
dd50: 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65  resource_val_ite
dd60: 6d 29 3b 0a 09 09 09 69 66 20 28 74 63 6c 5f 72  m);....if (tcl_r
dd70: 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  et != TCL_OK) {.
dd80: 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ....Tcl_SetObjRe
dd90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
dda0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69  _NewStringObj("i
ddb0: 6e 76 61 6c 69 64 20 72 65 71 75 65 73 74 22 2c  nvalid request",
ddc0: 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72 65 74 75   -1));......retu
ddd0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
dde0: 09 09 7d 0a 0a 09 09 09 72 65 73 6f 75 72 63 65  ..}.....resource
ddf0: 5f 76 61 6c 2e 72 6c 69 6d 5f 63 75 72 20 3d 20  _val.rlim_cur = 
de00: 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74 65  resource_val_ite
de10: 6d 3b 0a 0a 09 09 09 74 63 6c 5f 72 65 74 20 3d  m;.....tcl_ret =
de20: 20 54 63 6c 5f 44 69 63 74 4f 62 6a 47 65 74 28   Tcl_DictObjGet(
de30: 4e 55 4c 4c 2c 20 72 65 73 6f 75 72 63 65 5f 76  NULL, resource_v
de40: 61 6c 5f 69 74 65 6d 5f 6f 62 6a 2c 20 54 63 6c  al_item_obj, Tcl
de50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68  _NewStringObj("h
de60: 61 72 64 22 2c 20 2d 31 29 2c 20 26 72 65 73 6f  ard", -1), &reso
de70: 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 76 61 6c  urce_val_itemval
de80: 5f 6f 62 6a 29 3b 0a 09 09 09 69 66 20 28 74 63  _obj);....if (tc
de90: 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  l_ret != TCL_OK)
dea0: 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62   {.....Tcl_SetOb
deb0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
dec0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ded0: 28 22 69 6e 76 61 6c 69 64 20 72 65 71 75 65 73  ("invalid reques
dee0: 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72  t", -1));......r
def0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
df00: 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 63 6c 5f 72  ;....}.....tcl_r
df10: 65 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  et = Tcl_GetWide
df20: 49 6e 74 46 72 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c  IntFromObj(NULL,
df30: 20 72 65 73 6f 75 72 63 65 5f 76 61 6c 5f 69 74   resource_val_it
df40: 65 6d 76 61 6c 5f 6f 62 6a 2c 20 26 72 65 73 6f  emval_obj, &reso
df50: 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 29 3b 0a  urce_val_item);.
df60: 09 09 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21  ...if (tcl_ret !
df70: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 09  = TCL_OK) {.....
df80: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
df90: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
dfa0: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 76 61 6c  StringObj("inval
dfb0: 69 64 20 72 65 71 75 65 73 74 22 2c 20 2d 31 29  id request", -1)
dfc0: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 54  );......return(T
dfd0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  CL_ERROR);....}.
dfe0: 0a 09 09 09 72 65 73 6f 75 72 63 65 5f 76 61 6c  ....resource_val
dff0: 2e 72 6c 69 6d 5f 6d 61 78 20 3d 20 72 65 73 6f  .rlim_max = reso
e000: 75 72 63 65 5f 76 61 6c 5f 69 74 65 6d 3b 0a 09  urce_val_item;..
e010: 09 7d 0a 0a 09 09 72 6c 69 6d 69 74 5f 72 65 74  .}....rlimit_ret
e020: 20 3d 20 73 65 74 72 6c 69 6d 69 74 28 72 65 73   = setrlimit(res
e030: 6f 75 72 63 65 5f 69 64 2c 20 26 72 65 73 6f 75  ource_id, &resou
e040: 72 63 65 5f 76 61 6c 29 3b 0a 09 09 69 66 20 28  rce_val);...if (
e050: 72 6c 69 6d 69 74 5f 72 65 74 20 21 3d 20 30 29  rlimit_ret != 0)
e060: 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a   {....Tcl_SetObj
e070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
e080: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e090: 22 73 65 74 72 6c 69 6d 69 74 28 29 20 66 61 69  "setrlimit() fai
e0a0: 6c 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  led", -1));.....
e0b0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
e0c0: 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
e0d0: 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 54  (TCL_OK);..}...T
e0e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e0f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
e100: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 76 61 6c 69  tringObj("invali
e110: 64 20 6f 70 65 72 61 74 69 6f 6e 22 2c 20 2d 31  d operation", -1
e120: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  ));...return(TCL
e130: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74  _ERROR);.}..stat
e140: 69 63 20 69 6e 74 20 74 75 61 70 69 5f 6b 6c 6f  ic int tuapi_klo
e150: 67 63 74 6c 28 43 6c 69 65 6e 74 44 61 74 61 20  gctl(ClientData 
e160: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  cd, Tcl_Interp *
e170: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
e180: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54  , Tcl_Obj *CONST
e190: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 63 6c 5f   objv[]) {..Tcl_
e1a0: 4f 62 6a 20 2a 6f 70 65 72 61 74 69 6f 6e 5f 6f  Obj *operation_o
e1b0: 62 6a 3b 0a 09 63 68 61 72 20 2a 62 75 66 3b 0a  bj;..char *buf;.
e1c0: 09 69 6e 74 20 62 75 66 6c 65 6e 3b 0a 09 69 6e  .int buflen;..in
e1d0: 74 20 6b 6c 6f 67 5f 72 65 74 3b 0a 0a 09 69 66  t klog_ret;...if
e1e0: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 09   (objc < 2) {...
e1f0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e200: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
e210: 53 74 72 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67  StringObj("wrong
e220: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e230: 62 65 20 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79  be \"::tuapi::sy
e240: 73 63 61 6c 6c 3a 3a 6b 6c 6f 67 63 74 6c 20 6f  scall::klogctl o
e250: 70 65 72 61 74 69 6f 6e 20 2e 2e 2e 5c 22 22 2c  peration ...\"",
e260: 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
e270: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
e280: 0a 09 6b 6c 6f 67 5f 72 65 74 20 3d 20 6b 6c 6f  ..klog_ret = klo
e290: 67 63 74 6c 28 53 59 53 4c 4f 47 5f 41 43 54 49  gctl(SYSLOG_ACTI
e2a0: 4f 4e 5f 4f 50 45 4e 2c 20 4e 55 4c 4c 2c 20 30  ON_OPEN, NULL, 0
e2b0: 29 3b 0a 09 69 66 20 28 6b 6c 6f 67 5f 72 65 74  );..if (klog_ret
e2c0: 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53   != 0) {...Tcl_S
e2d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
e2e0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
e2f0: 67 4f 62 6a 28 22 6b 6c 6f 67 63 74 6c 28 53 59  gObj("klogctl(SY
e300: 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f 4f 50 45 4e  SLOG_ACTION_OPEN
e310: 2c 20 2e 2e 2e 29 20 66 61 69 6c 65 64 22 2c 20  , ...) failed", 
e320: 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 28 54  -1));...return(T
e330: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  CL_ERROR);..}...
e340: 6f 70 65 72 61 74 69 6f 6e 5f 6f 62 6a 20 3d 20  operation_obj = 
e350: 6f 62 6a 76 5b 31 5d 3b 0a 09 73 77 69 74 63 68  objv[1];..switch
e360: 20 28 74 75 61 70 69 5f 69 6e 74 65 72 6e 61 6c   (tuapi_internal
e370: 5f 73 69 6d 70 6c 65 68 61 73 68 5f 6f 62 6a 28  _simplehash_obj(
e380: 6f 70 65 72 61 74 69 6f 6e 5f 6f 62 6a 29 29 20  operation_obj)) 
e390: 7b 0a 09 09 63 61 73 65 20 30 78 65 35 39 37 30  {...case 0xe5970
e3a0: 65 34 4c 55 3a 20 2f 2a 20 72 65 61 64 20 2a 2f  e4LU: /* read */
e3b0: 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 32 35 36  ....buflen = 256
e3c0: 20 2a 20 31 30 32 34 3b 0a 09 09 09 62 75 66 20   * 1024;....buf 
e3d0: 3d 20 6d 61 6c 6c 6f 63 28 62 75 66 6c 65 6e 29  = malloc(buflen)
e3e0: 3b 0a 09 09 09 69 66 20 28 62 75 66 20 3d 3d 20  ;....if (buf == 
e3f0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 54 63 6c 5f  NULL) {.....Tcl_
e400: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e410: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
e420: 6e 67 4f 62 6a 28 22 6d 61 6c 6c 6f 63 20 66 61  ngObj("malloc fa
e430: 69 6c 65 64 20 21 22 2c 20 2d 31 29 29 3b 0a 0a  iled !", -1));..
e440: 09 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
e450: 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
e460: 6b 6c 6f 67 5f 72 65 74 20 3d 20 6b 6c 6f 67 63  klog_ret = klogc
e470: 74 6c 28 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e  tl(SYSLOG_ACTION
e480: 5f 52 45 41 44 5f 41 4c 4c 2c 20 62 75 66 2c 20  _READ_ALL, buf, 
e490: 62 75 66 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  buflen);....if (
e4a0: 6b 6c 6f 67 5f 72 65 74 20 3d 3d 20 2d 31 29 20  klog_ret == -1) 
e4b0: 7b 0a 09 09 09 09 66 72 65 65 28 62 75 66 29 3b  {.....free(buf);
e4c0: 0a 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ......Tcl_SetObj
e4d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
e4e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e4f0: 22 6b 6c 6f 67 63 74 6c 28 53 59 53 4c 4f 47 5f  "klogctl(SYSLOG_
e500: 41 43 54 49 4f 4e 5f 52 45 41 44 5f 41 4c 4c 2c  ACTION_READ_ALL,
e510: 20 2e 2e 2e 29 20 66 61 69 6c 65 64 22 2c 20 2d   ...) failed", -
e520: 31 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  1));......return
e530: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  (TCL_ERROR);....
e540: 7d 0a 0a 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a  }.....Tcl_SetObj
e550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
e560: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
e570: 62 6a 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  bj((unsigned cha
e580: 72 20 2a 29 20 62 75 66 2c 20 6b 6c 6f 67 5f 72  r *) buf, klog_r
e590: 65 74 29 29 3b 0a 0a 09 09 09 66 72 65 65 28 62  et));.....free(b
e5a0: 75 66 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  uf);.....return(
e5b0: 54 43 4c 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20  TCL_OK);...case 
e5c0: 30 78 33 64 39 39 37 33 66 32 4c 55 3a 20 2f 2a  0x3d9973f2LU: /*
e5d0: 20 63 6c 65 61 72 20 2a 2f 0a 09 09 09 6b 6c 6f   clear */....klo
e5e0: 67 5f 72 65 74 20 3d 20 6b 6c 6f 67 63 74 6c 28  g_ret = klogctl(
e5f0: 53 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f 43 4c  SYSLOG_ACTION_CL
e600: 45 41 52 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09  EAR, NULL, 0);..
e610: 09 09 69 66 20 28 6b 6c 6f 67 5f 72 65 74 20 3d  ..if (klog_ret =
e620: 3d 20 2d 31 29 20 7b 0a 09 09 09 09 54 63 6c 5f  = -1) {.....Tcl_
e630: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e640: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
e650: 6e 67 4f 62 6a 28 22 6b 6c 6f 67 63 74 6c 28 53  ngObj("klogctl(S
e660: 59 53 4c 4f 47 5f 41 43 54 49 4f 4e 5f 43 4c 45  YSLOG_ACTION_CLE
e670: 41 52 2c 20 2e 2e 2e 29 20 66 61 69 6c 65 64 22  AR, ...) failed"
e680: 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72 65 74  , -1));......ret
e690: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
e6a0: 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
e6b0: 54 43 4c 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20  TCL_OK);...case 
e6c0: 30 78 32 32 35 63 33 33 36 65 4c 55 3a 20 2f 2a  0x225c336eLU: /*
e6d0: 20 63 6f 6e 73 6f 6c 65 5f 6f 6e 20 2a 2f 0a 09   console_on */..
e6e0: 09 09 6b 6c 6f 67 5f 72 65 74 20 3d 20 6b 6c 6f  ..klog_ret = klo
e6f0: 67 63 74 6c 28 53 59 53 4c 4f 47 5f 41 43 54 49  gctl(SYSLOG_ACTI
e700: 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f 4f 4e 2c 20 4e  ON_CONSOLE_ON, N
e710: 55 4c 4c 2c 20 30 29 3b 0a 09 09 09 69 66 20 28  ULL, 0);....if (
e720: 6b 6c 6f 67 5f 72 65 74 20 3d 3d 20 2d 31 29 20  klog_ret == -1) 
e730: 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62 6a  {.....Tcl_SetObj
e740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
e750: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e760: 22 6b 6c 6f 67 63 74 6c 28 53 59 53 4c 4f 47 5f  "klogctl(SYSLOG_
e770: 41 43 54 49 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f 4f  ACTION_CONSOLE_O
e780: 4e 2c 20 2e 2e 2e 29 20 66 61 69 6c 65 64 22 2c  N, ...) failed",
e790: 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72 65 74 75   -1));......retu
e7a0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
e7b0: 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 54  ..}.....return(T
e7c0: 43 4c 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 30  CL_OK);...case 0
e7d0: 78 32 65 31 39 62 62 65 36 4c 55 3a 20 2f 2a 20  x2e19bbe6LU: /* 
e7e0: 63 6f 6e 73 6f 6c 65 5f 6f 66 66 20 2a 2f 0a 09  console_off */..
e7f0: 09 09 6b 6c 6f 67 5f 72 65 74 20 3d 20 6b 6c 6f  ..klog_ret = klo
e800: 67 63 74 6c 28 53 59 53 4c 4f 47 5f 41 43 54 49  gctl(SYSLOG_ACTI
e810: 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f 4f 46 46 2c 20  ON_CONSOLE_OFF, 
e820: 4e 55 4c 4c 2c 20 30 29 3b 0a 09 09 09 69 66 20  NULL, 0);....if 
e830: 28 6b 6c 6f 67 5f 72 65 74 20 3d 3d 20 2d 31 29  (klog_ret == -1)
e840: 20 7b 0a 09 09 09 09 54 63 6c 5f 53 65 74 4f 62   {.....Tcl_SetOb
e850: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
e860: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
e870: 28 22 6b 6c 6f 67 63 74 6c 28 53 59 53 4c 4f 47  ("klogctl(SYSLOG
e880: 5f 41 43 54 49 4f 4e 5f 43 4f 4e 53 4f 4c 45 5f  _ACTION_CONSOLE_
e890: 4f 46 46 2c 20 2e 2e 2e 29 20 66 61 69 6c 65 64  OFF, ...) failed
e8a0: 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 09 72 65  ", -1));......re
e8b0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
e8c0: 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
e8d0: 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 54  (TCL_OK);..}...T
e8e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e8f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
e900: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 76 61 6c 69  tringObj("invali
e910: 64 20 73 75 62 63 6f 6d 6d 61 6e 64 22 2c 20 2d  d subcommand", -
e920: 31 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43  1));...return(TC
e930: 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61  L_ERROR);.}..sta
e940: 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 77 61  tic int tuapi_wa
e950: 69 74 70 69 64 28 43 6c 69 65 6e 74 44 61 74 61  itpid(ClientData
e960: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20   cd, Tcl_Interp 
e970: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
e980: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  c, Tcl_Obj *CONS
e990: 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 70 69 64  T objv[]) {..pid
e9a0: 5f 74 20 63 68 69 6c 64 3b 0a 09 69 6e 74 20 73  _t child;..int s
e9b0: 74 61 74 75 73 3b 0a 0a 09 63 68 69 6c 64 20 3d  tatus;...child =
e9c0: 20 77 61 69 74 70 69 64 28 2d 31 2c 20 26 73 74   waitpid(-1, &st
e9d0: 61 74 75 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a  atus, WNOHANG);.
e9e0: 09 69 66 20 28 63 68 69 6c 64 20 3c 20 30 29 20  .if (child < 0) 
e9f0: 7b 0a 09 09 69 66 20 28 65 72 72 6e 6f 20 21 3d  {...if (errno !=
ea00: 20 45 43 48 49 4c 44 29 20 7b 0a 09 09 09 54 63   ECHILD) {....Tc
ea10: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
ea20: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
ea30: 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72  ringObj(strerror
ea40: 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a  (errno), -1));..
ea50: 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
ea60: 52 4f 52 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  ROR);...} else {
ea70: 0a 09 09 09 63 68 69 6c 64 20 3d 20 30 3b 0a 09  ....child = 0;..
ea80: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 68 69 6c  .}..}...if (chil
ea90: 64 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  d != 0) {...Tcl_
eaa0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
eab0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
eac0: 49 6e 74 4f 62 6a 28 63 68 69 6c 64 29 29 3b 0a  IntObj(child));.
ead0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  .}...return(TCL_
eae0: 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OK);.}..static i
eaf0: 6e 74 20 74 75 61 70 69 5f 73 65 74 74 69 6d 65  nt tuapi_settime
eb00: 6f 66 64 61 79 28 43 6c 69 65 6e 74 44 61 74 61  ofday(ClientData
eb10: 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20   cd, Tcl_Interp 
eb20: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
eb30: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  c, Tcl_Obj *CONS
eb40: 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 73 74 72  T objv[]) {..str
eb50: 75 63 74 20 74 69 6d 65 76 61 6c 20 74 76 3b 0a  uct timeval tv;.
eb60: 09 54 63 6c 5f 57 69 64 65 49 6e 74 20 74 76 5f  .Tcl_WideInt tv_
eb70: 73 65 63 5f 76 61 6c 2c 20 74 76 5f 75 73 65 63  sec_val, tv_usec
eb80: 5f 76 61 6c 3b 0a 09 69 6e 74 20 73 65 74 74 69  _val;..int setti
eb90: 6d 65 6f 66 64 61 79 5f 72 65 74 2c 20 74 63 6c  meofday_ret, tcl
eba0: 5f 72 65 74 3b 0a 0a 09 69 66 20 28 6f 62 6a 63  _ret;...if (objc
ebb0: 20 21 3d 20 33 29 20 7b 0a 09 09 54 63 6c 5f 53   != 3) {...Tcl_S
ebc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ebd0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
ebe0: 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72  gObj("wrong # ar
ebf0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
ec00: 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c  ::tuapi::syscall
ec10: 3a 3a 73 65 74 74 69 6d 65 6f 66 64 61 79 20 73  ::settimeofday s
ec20: 65 63 6f 6e 64 73 20 6d 69 63 72 6f 73 65 63 6f  econds microseco
ec30: 6e 64 73 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09  nds\"", -1));...
ec40: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
ec50: 52 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74  R);..}...tcl_ret
ec60: 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e   = Tcl_GetWideIn
ec70: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
ec80: 20 6f 62 6a 76 5b 31 5d 2c 20 26 74 76 5f 73 65   objv[1], &tv_se
ec90: 63 5f 76 61 6c 29 3b 0a 09 69 66 20 28 74 63 6c  c_val);..if (tcl
eca0: 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  _ret != TCL_OK) 
ecb0: 7b 0a 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72  {...return(tcl_r
ecc0: 65 74 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65  et);..}...tcl_re
ecd0: 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49  t = Tcl_GetWideI
ece0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
ecf0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 74 76 5f 75  , objv[2], &tv_u
ed00: 73 65 63 5f 76 61 6c 29 3b 0a 09 69 66 20 28 74  sec_val);..if (t
ed10: 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b  cl_ret != TCL_OK
ed20: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 74 63 6c  ) {...return(tcl
ed30: 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 74 76 2e 74  _ret);..}...tv.t
ed40: 76 5f 73 65 63 20 3d 20 74 76 5f 73 65 63 5f 76  v_sec = tv_sec_v
ed50: 61 6c 3b 0a 09 74 76 2e 74 76 5f 75 73 65 63 20  al;..tv.tv_usec 
ed60: 3d 20 74 76 5f 75 73 65 63 5f 76 61 6c 3b 20 0a  = tv_usec_val; .
ed70: 0a 09 73 65 74 74 69 6d 65 6f 66 64 61 79 5f 72  ..settimeofday_r
ed80: 65 74 20 3d 20 73 65 74 74 69 6d 65 6f 66 64 61  et = settimeofda
ed90: 79 28 26 74 76 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  y(&tv, NULL);...
eda0: 69 66 20 28 73 65 74 74 69 6d 65 6f 66 64 61 79  if (settimeofday
edb0: 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 54 63  _ret < 0) {...Tc
edc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
edd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
ede0: 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72  ringObj(strerror
edf0: 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a  (errno), -1));..
ee00: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
ee10: 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  OR);..}...return
ee20: 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 23 69 66  (TCL_OK);.}..#if
ee30: 6e 64 65 66 20 44 49 53 41 42 4c 45 5f 55 4e 49  ndef DISABLE_UNI
ee40: 58 5f 53 4f 43 4b 45 54 53 0a 73 74 72 75 63 74  X_SOCKETS.struct
ee50: 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e   tuapi_socket_un
ee60: 69 78 5f 5f 63 68 61 6e 5f 69 64 20 7b 0a 09 69  ix__chan_id {..i
ee70: 6e 74 20 66 64 3b 0a 09 54 63 6c 5f 43 68 61 6e  nt fd;..Tcl_Chan
ee80: 6e 65 6c 20 63 68 61 6e 3b 0a 7d 3b 0a 0a 73 74  nel chan;.};..st
ee90: 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 73  atic int tuapi_s
eea0: 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e  ocket_unix__chan
eeb0: 5f 63 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61 74  _close(ClientDat
eec0: 61 20 69 64 5f 70 2c 20 54 63 6c 5f 49 6e 74 65  a id_p, Tcl_Inte
eed0: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 09 73  rp *interp) {..s
eee0: 74 72 75 63 74 20 74 75 61 70 69 5f 73 6f 63 6b  truct tuapi_sock
eef0: 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 69 64  et_unix__chan_id
ef00: 20 2a 69 64 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a   *id;..int fd;..
ef10: 09 69 64 20 3d 20 69 64 5f 70 3b 0a 0a 09 66 64  .id = id_p;...fd
ef20: 20 3d 20 69 64 2d 3e 66 64 3b 0a 0a 09 63 6c 6f   = id->fd;...clo
ef30: 73 65 28 66 64 29 3b 0a 0a 09 66 72 65 65 28 69  se(fd);...free(i
ef40: 64 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  d);...return(0);
ef50: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
ef60: 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78  uapi_socket_unix
ef70: 5f 5f 63 68 61 6e 5f 72 65 61 64 28 43 6c 69 65  __chan_read(Clie
ef80: 6e 74 44 61 74 61 20 69 64 5f 70 2c 20 63 68 61  ntData id_p, cha
ef90: 72 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 73  r *buf, int bufs
efa0: 69 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43  ize, int *errorC
efb0: 6f 64 65 50 74 72 29 20 7b 0a 09 73 74 72 75 63  odePtr) {..struc
efc0: 74 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75  t tuapi_socket_u
efd0: 6e 69 78 5f 5f 63 68 61 6e 5f 69 64 20 2a 69 64  nix__chan_id *id
efe0: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f  ;..ssize_t read_
eff0: 72 65 74 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 69  ret;..int fd;..i
f000: 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09 69 64 20  nt retval;...id 
f010: 3d 20 69 64 5f 70 3b 0a 0a 09 66 64 20 3d 20 69  = id_p;...fd = i
f020: 64 2d 3e 66 64 3b 0a 0a 09 72 65 61 64 5f 72 65  d->fd;...read_re
f030: 74 20 3d 20 72 65 61 64 28 66 64 2c 20 62 75 66  t = read(fd, buf
f040: 2c 20 62 75 66 73 69 7a 65 29 3b 0a 09 69 66 20  , bufsize);..if 
f050: 28 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  (read_ret < 0) {
f060: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ...*errorCodePtr
f070: 20 3d 20 65 72 72 6e 6f 3b 0a 0a 09 09 72 65 74   = errno;....ret
f080: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65  urn(-1);..}...re
f090: 74 76 61 6c 20 3d 20 72 65 61 64 5f 72 65 74 3b  tval = read_ret;
f0a0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
f0b0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
f0c0: 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e   tuapi_socket_un
f0d0: 69 78 5f 5f 63 68 61 6e 5f 77 72 69 74 65 28 43  ix__chan_write(C
f0e0: 6c 69 65 6e 74 44 61 74 61 20 69 64 5f 70 2c 20  lientData id_p, 
f0f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c  const char *buf,
f100: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e   int toWrite, in
f110: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  t *errorCodePtr)
f120: 20 7b 0a 09 73 74 72 75 63 74 20 74 75 61 70 69   {..struct tuapi
f130: 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68  _socket_unix__ch
f140: 61 6e 5f 69 64 20 2a 69 64 3b 0a 09 73 73 69 7a  an_id *id;..ssiz
f150: 65 5f 74 20 77 72 69 74 65 5f 72 65 74 3b 0a 09  e_t write_ret;..
f160: 69 6e 74 20 66 64 3b 0a 09 69 6e 74 20 62 79 74  int fd;..int byt
f170: 65 73 57 72 69 74 74 65 6e 3b 0a 0a 09 69 64 20  esWritten;...id 
f180: 3d 20 69 64 5f 70 3b 0a 0a 09 66 64 20 3d 20 69  = id_p;...fd = i
f190: 64 2d 3e 66 64 3b 0a 0a 09 62 79 74 65 73 57 72  d->fd;...bytesWr
f1a0: 69 74 74 65 6e 20 3d 20 30 3b 0a 09 77 68 69 6c  itten = 0;..whil
f1b0: 65 20 28 74 6f 57 72 69 74 65 29 20 7b 0a 09 09  e (toWrite) {...
f1c0: 77 72 69 74 65 5f 72 65 74 20 3d 20 77 72 69 74  write_ret = writ
f1d0: 65 28 66 64 2c 20 62 75 66 2c 20 74 6f 57 72 69  e(fd, buf, toWri
f1e0: 74 65 29 3b 0a 09 09 69 66 20 28 77 72 69 74 65  te);...if (write
f1f0: 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09  _ret == 0) {....
f200: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
f210: 20 28 77 72 69 74 65 5f 72 65 74 20 3c 20 30 29   (write_ret < 0)
f220: 20 7b 0a 09 09 09 2a 65 72 72 6f 72 43 6f 64 65   {....*errorCode
f230: 50 74 72 20 3d 20 65 72 72 6e 6f 3b 0a 0a 09 09  Ptr = errno;....
f240: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
f250: 0a 0a 09 09 74 6f 57 72 69 74 65 20 2d 3d 20 77  ....toWrite -= w
f260: 72 69 74 65 5f 72 65 74 3b 0a 09 09 62 75 66 20  rite_ret;...buf 
f270: 2b 3d 20 77 72 69 74 65 5f 72 65 74 3b 0a 09 09  += write_ret;...
f280: 62 79 74 65 73 57 72 69 74 74 65 6e 20 2b 3d 20  bytesWritten += 
f290: 77 72 69 74 65 5f 72 65 74 3b 0a 09 7d 0a 0a 09  write_ret;..}...
f2a0: 69 66 20 28 62 79 74 65 73 57 72 69 74 74 65 6e  if (bytesWritten
f2b0: 20 3d 3d 20 30 29 20 7b 0a 09 09 2a 65 72 72 6f   == 0) {...*erro
f2c0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
f2d0: 4e 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  N;....return(-1)
f2e0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 62 79  ;..}...return(by
f2f0: 74 65 73 57 72 69 74 74 65 6e 29 3b 0a 7d 0a 0a  tesWritten);.}..
f300: 73 74 61 74 69 63 20 76 6f 69 64 20 74 75 61 70  static void tuap
f310: 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63  i_socket_unix__c
f320: 68 61 6e 5f 65 76 65 6e 74 68 61 6e 64 6c 65 72  han_eventhandler
f330: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 64 5f 70  (ClientData id_p
f340: 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 09 73  , int mask) {..s
f350: 74 72 75 63 74 20 74 75 61 70 69 5f 73 6f 63 6b  truct tuapi_sock
f360: 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 69 64  et_unix__chan_id
f370: 20 2a 69 64 3b 0a 09 54 63 6c 5f 43 68 61 6e 6e   *id;..Tcl_Chann
f380: 65 6c 20 63 68 61 6e 3b 0a 0a 09 69 64 20 3d 20  el chan;...id = 
f390: 69 64 5f 70 3b 0a 0a 09 63 68 61 6e 20 3d 20 69  id_p;...chan = i
f3a0: 64 2d 3e 63 68 61 6e 3b 0a 0a 09 69 66 20 28 21  d->chan;...if (!
f3b0: 63 68 61 6e 29 20 7b 0a 09 09 72 65 74 75 72 6e  chan) {...return
f3c0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 4e 6f 74 69 66  ;..}...Tcl_Notif
f3d0: 79 43 68 61 6e 6e 65 6c 28 63 68 61 6e 2c 20 6d  yChannel(chan, m
f3e0: 61 73 6b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ask);.}..static 
f3f0: 76 6f 69 64 20 74 75 61 70 69 5f 73 6f 63 6b 65  void tuapi_socke
f400: 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 77 61 74  t_unix__chan_wat
f410: 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69 64  ch(ClientData id
f420: 5f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a  _p, int mask) {.
f430: 09 73 74 72 75 63 74 20 74 75 61 70 69 5f 73 6f  .struct tuapi_so
f440: 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f  cket_unix__chan_
f450: 69 64 20 2a 69 64 3b 0a 09 69 6e 74 20 66 64 3b  id *id;..int fd;
f460: 0a 0a 09 69 64 20 3d 20 69 64 5f 70 3b 0a 0a 09  ...id = id_p;...
f470: 66 64 20 3d 20 69 64 2d 3e 66 64 3b 0a 0a 09 54  fd = id->fd;...T
f480: 63 6c 5f 43 72 65 61 74 65 46 69 6c 65 48 61 6e  cl_CreateFileHan
f490: 64 6c 65 72 28 66 64 2c 20 6d 61 73 6b 2c 20 74  dler(fd, mask, t
f4a0: 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78  uapi_socket_unix
f4b0: 5f 5f 63 68 61 6e 5f 65 76 65 6e 74 68 61 6e 64  __chan_eventhand
f4c0: 6c 65 72 2c 20 69 64 29 3b 0a 0a 09 72 65 74 75  ler, id);...retu
f4d0: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rn;.}..static in
f4e0: 74 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75  t tuapi_socket_u
f4f0: 6e 69 78 5f 5f 63 68 61 6e 5f 67 65 74 68 61 6e  nix__chan_gethan
f500: 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  dle(ClientData i
f510: 64 5f 70 2c 20 69 6e 74 20 64 69 72 65 63 74 69  d_p, int directi
f520: 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a  on, ClientData *
f530: 68 61 6e 64 6c 65 50 74 72 29 20 7b 0a 09 73 74  handlePtr) {..st
f540: 72 75 63 74 20 74 75 61 70 69 5f 73 6f 63 6b 65  ruct tuapi_socke
f550: 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f 69 64 20  t_unix__chan_id 
f560: 2a 69 64 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 43  *id;..int fd;..C
f570: 6c 69 65 6e 74 44 61 74 61 20 66 64 5f 63 64 3b  lientData fd_cd;
f580: 0a 0a 09 69 64 20 3d 20 69 64 5f 70 3b 0a 0a 09  ...id = id_p;...
f590: 66 64 20 3d 20 69 64 2d 3e 66 64 3b 0a 0a 09 6d  fd = id->fd;...m
f5a0: 65 6d 63 70 79 28 26 66 64 5f 63 64 2c 20 26 66  emcpy(&fd_cd, &f
f5b0: 64 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a  d, sizeof(fd));.
f5c0: 0a 09 2a 68 61 6e 64 6c 65 50 74 72 20 3d 20 66  ..*handlePtr = f
f5d0: 64 5f 63 64 3b 0a 0a 09 72 65 74 75 72 6e 28 54  d_cd;...return(T
f5e0: 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69  CL_OK);.}..stati
f5f0: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 74 75  c Tcl_Channel tu
f600: 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
f610: 73 6f 63 6b 32 74 63 6c 63 68 61 6e 28 69 6e 74  sock2tclchan(int
f620: 20 73 6f 63 6b 29 20 7b 0a 09 73 74 72 75 63 74   sock) {..struct
f630: 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e   tuapi_socket_un
f640: 69 78 5f 5f 63 68 61 6e 5f 69 64 20 2a 69 64 3b  ix__chan_id *id;
f650: 0a 09 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61  ..static Tcl_Cha
f660: 6e 6e 65 6c 54 79 70 65 20 74 63 6c 5f 63 68 61  nnelType tcl_cha
f670: 6e 5f 74 79 70 65 3b 0a 09 73 74 61 74 69 63 20  n_type;..static 
f680: 69 6e 74 20 74 63 6c 5f 63 68 61 6e 5f 74 79 70  int tcl_chan_typ
f690: 65 5f 69 6e 69 74 20 3d 20 30 3b 0a 09 54 63 6c  e_init = 0;..Tcl
f6a0: 5f 43 68 61 6e 6e 65 6c 20 74 63 6c 5f 63 68 61  _Channel tcl_cha
f6b0: 6e 3b 0a 09 63 68 61 72 20 63 68 61 6e 5f 6e 61  n;..char chan_na
f6c0: 6d 65 5b 33 32 5d 3b 0a 09 69 6e 74 20 73 6f 63  me[32];..int soc
f6d0: 6b 5f 66 6c 61 67 73 3b 0a 0a 09 69 66 20 28 21  k_flags;...if (!
f6e0: 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65 5f 69 6e  tcl_chan_type_in
f6f0: 69 74 29 20 7b 0a 09 09 74 63 6c 5f 63 68 61 6e  it) {...tcl_chan
f700: 5f 74 79 70 65 2e 74 79 70 65 4e 61 6d 65 20 3d  _type.typeName =
f710: 20 22 73 6f 63 6b 65 74 22 3b 0a 09 09 74 63 6c   "socket";...tcl
f720: 5f 63 68 61 6e 5f 74 79 70 65 2e 76 65 72 73 69  _chan_type.versi
f730: 6f 6e 20 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  on = TCL_CHANNEL
f740: 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 09 09 74 63  _VERSION_2;...tc
f750: 6c 5f 63 68 61 6e 5f 74 79 70 65 2e 63 6c 6f 73  l_chan_type.clos
f760: 65 50 72 6f 63 20 3d 20 74 75 61 70 69 5f 73 6f  eProc = tuapi_so
f770: 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f  cket_unix__chan_
f780: 63 6c 6f 73 65 3b 0a 09 09 74 63 6c 5f 63 68 61  close;...tcl_cha
f790: 6e 5f 74 79 70 65 2e 69 6e 70 75 74 50 72 6f 63  n_type.inputProc
f7a0: 20 3d 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f   = tuapi_socket_
f7b0: 75 6e 69 78 5f 5f 63 68 61 6e 5f 72 65 61 64 3b  unix__chan_read;
f7c0: 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65  ...tcl_chan_type
f7d0: 2e 6f 75 74 70 75 74 50 72 6f 63 20 3d 20 74 75  .outputProc = tu
f7e0: 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
f7f0: 5f 63 68 61 6e 5f 77 72 69 74 65 3b 0a 09 09 74  _chan_write;...t
f800: 63 6c 5f 63 68 61 6e 5f 74 79 70 65 2e 77 61 74  cl_chan_type.wat
f810: 63 68 50 72 6f 63 20 3d 20 74 75 61 70 69 5f 73  chProc = tuapi_s
f820: 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e  ocket_unix__chan
f830: 5f 77 61 74 63 68 3b 0a 09 09 74 63 6c 5f 63 68  _watch;...tcl_ch
f840: 61 6e 5f 74 79 70 65 2e 67 65 74 48 61 6e 64 6c  an_type.getHandl
f850: 65 50 72 6f 63 20 3d 20 74 75 61 70 69 5f 73 6f  eProc = tuapi_so
f860: 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e 5f  cket_unix__chan_
f870: 67 65 74 68 61 6e 64 6c 65 3b 0a 09 09 74 63 6c  gethandle;...tcl
f880: 5f 63 68 61 6e 5f 74 79 70 65 2e 73 65 65 6b 50  _chan_type.seekP
f890: 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 74 63  roc = NULL;...tc
f8a0: 6c 5f 63 68 61 6e 5f 74 79 70 65 2e 73 65 74 4f  l_chan_type.setO
f8b0: 70 74 69 6f 6e 50 72 6f 63 20 3d 20 4e 55 4c 4c  ptionProc = NULL
f8c0: 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74 79 70  ;...tcl_chan_typ
f8d0: 65 2e 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  e.getOptionProc 
f8e0: 3d 20 4e 55 4c 4c 3b 0a 09 09 74 63 6c 5f 63 68  = NULL;...tcl_ch
f8f0: 61 6e 5f 74 79 70 65 2e 63 6c 6f 73 65 32 50 72  an_type.close2Pr
f900: 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 74 63 6c  oc = NULL;...tcl
f910: 5f 63 68 61 6e 5f 74 79 70 65 2e 62 6c 6f 63 6b  _chan_type.block
f920: 4d 6f 64 65 50 72 6f 63 20 3d 20 4e 55 4c 4c 3b  ModeProc = NULL;
f930: 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74 79 70 65  ...tcl_chan_type
f940: 2e 66 6c 75 73 68 50 72 6f 63 20 3d 20 4e 55 4c  .flushProc = NUL
f950: 4c 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f 74 79  L;...tcl_chan_ty
f960: 70 65 2e 68 61 6e 64 6c 65 72 50 72 6f 63 20 3d  pe.handlerProc =
f970: 20 4e 55 4c 4c 3b 0a 09 09 74 63 6c 5f 63 68 61   NULL;...tcl_cha
f980: 6e 5f 74 79 70 65 2e 77 69 64 65 53 65 65 6b 50  n_type.wideSeekP
f990: 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 74 63  roc = NULL;...tc
f9a0: 6c 5f 63 68 61 6e 5f 74 79 70 65 2e 74 68 72 65  l_chan_type.thre
f9b0: 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 3d 20 4e  adActionProc = N
f9c0: 55 4c 4c 3b 0a 09 09 74 63 6c 5f 63 68 61 6e 5f  ULL;...tcl_chan_
f9d0: 74 79 70 65 2e 74 72 75 6e 63 61 74 65 50 72 6f  type.truncatePro
f9e0: 63 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 74 63 6c  c = NULL;....tcl
f9f0: 5f 63 68 61 6e 5f 74 79 70 65 5f 69 6e 69 74 20  _chan_type_init 
fa00: 3d 20 31 3b 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e  = 1;..}...snprin
fa10: 74 66 28 63 68 61 6e 5f 6e 61 6d 65 2c 20 73 69  tf(chan_name, si
fa20: 7a 65 6f 66 28 63 68 61 6e 5f 6e 61 6d 65 29 2c  zeof(chan_name),
fa30: 20 22 73 6f 63 6b 25 75 22 2c 20 73 6f 63 6b 29   "sock%u", sock)
fa40: 3b 0a 0a 09 69 64 20 3d 20 6d 61 6c 6c 6f 63 28  ;...id = malloc(
fa50: 73 69 7a 65 6f 66 28 2a 69 64 29 29 3b 0a 09 69  sizeof(*id));..i
fa60: 66 20 28 69 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  f (id == NULL) {
fa70: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
fa80: 0a 09 7d 0a 0a 09 69 64 2d 3e 66 64 20 3d 20 73  ..}...id->fd = s
fa90: 6f 63 6b 3b 0a 09 69 64 2d 3e 63 68 61 6e 20 3d  ock;..id->chan =
faa0: 20 4e 55 4c 4c 3b 0a 0a 09 2f 2a 20 43 6f 6e 66   NULL;.../* Conf
fab0: 69 67 75 72 65 20 73 6f 63 6b 65 74 20 61 73 20  igure socket as 
fac0: 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  non-blocking */.
fad0: 09 73 6f 63 6b 5f 66 6c 61 67 73 20 3d 20 66 63  .sock_flags = fc
fae0: 6e 74 6c 28 73 6f 63 6b 2c 20 46 5f 47 45 54 46  ntl(sock, F_GETF
faf0: 4c 2c 20 30 29 3b 0a 09 69 66 20 28 73 6f 63 6b  L, 0);..if (sock
fb00: 5f 66 6c 61 67 73 20 3d 3d 20 2d 31 29 20 7b 0a  _flags == -1) {.
fb10: 09 09 73 6f 63 6b 5f 66 6c 61 67 73 20 3d 20 4f  ..sock_flags = O
fb20: 5f 4e 4f 4e 42 4c 4f 43 4b 3b 0a 09 7d 20 65 6c  _NONBLOCK;..} el
fb30: 73 65 20 7b 0a 09 09 73 6f 63 6b 5f 66 6c 61 67  se {...sock_flag
fb40: 73 20 7c 3d 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 3b  s |= O_NONBLOCK;
fb50: 0a 09 7d 0a 09 66 63 6e 74 6c 28 73 6f 63 6b 2c  ..}..fcntl(sock,
fb60: 20 46 5f 53 45 54 46 4c 2c 20 28 6c 6f 6e 67 29   F_SETFL, (long)
fb70: 20 73 6f 63 6b 5f 66 6c 61 67 73 29 3b 0a 0a 09   sock_flags);...
fb80: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 63 68  /* Create the ch
fb90: 61 6e 6e 65 6c 20 2a 2f 0a 09 74 63 6c 5f 63 68  annel */..tcl_ch
fba0: 61 6e 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43  an = Tcl_CreateC
fbb0: 68 61 6e 6e 65 6c 28 26 74 63 6c 5f 63 68 61 6e  hannel(&tcl_chan
fbc0: 5f 74 79 70 65 2c 20 63 68 61 6e 5f 6e 61 6d 65  _type, chan_name
fbd0: 2c 20 69 64 2c 20 54 43 4c 5f 52 45 41 44 41 42  , id, TCL_READAB
fbe0: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
fbf0: 45 29 3b 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20  E);.../* Update 
fc00: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
fc10: 73 73 65 64 20 74 6f 20 65 61 63 68 20 66 75 6e  ssed to each fun
fc20: 63 74 69 6f 6e 20 74 6f 20 69 6e 63 6c 75 64 65  ction to include
fc30: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 6e 61 6d   the channel nam
fc40: 65 20 2a 2f 0a 09 69 64 2d 3e 63 68 61 6e 20 3d  e */..id->chan =
fc50: 20 74 63 6c 5f 63 68 61 6e 3b 0a 0a 09 72 65 74   tcl_chan;...ret
fc60: 75 72 6e 28 74 63 6c 5f 63 68 61 6e 29 3b 0a 7d  urn(tcl_chan);.}
fc70: 0a 0a 73 74 72 75 63 74 20 74 75 61 70 69 5f 73  ..struct tuapi_s
fc80: 6f 63 6b 65 74 5f 75 6e 69 78 5f 5f 63 68 61 6e  ocket_unix__chan
fc90: 5f 61 63 63 65 70 74 5f 63 64 20 7b 0a 09 69 6e  _accept_cd {..in
fca0: 74 20 66 64 3b 0a 09 54 63 6c 5f 49 6e 74 65 72  t fd;..Tcl_Inter
fcb0: 70 20 2a 69 6e 74 65 72 70 3b 0a 09 54 63 6c 5f  p *interp;..Tcl_
fcc0: 4f 62 6a 20 2a 63 6f 6d 6d 61 6e 64 3b 0a 7d 3b  Obj *command;.};
fcd0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 75  ..static void tu
fce0: 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
fcf0: 5f 63 68 61 6e 5f 61 63 63 65 70 74 28 43 6c 69  _chan_accept(Cli
fd00: 65 6e 74 44 61 74 61 20 63 64 5f 70 2c 20 69 6e  entData cd_p, in
fd10: 74 20 6d 61 73 6b 29 20 7b 0a 09 73 74 72 75 63  t mask) {..struc
fd20: 74 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75  t tuapi_socket_u
fd30: 6e 69 78 5f 5f 63 68 61 6e 5f 61 63 63 65 70 74  nix__chan_accept
fd40: 5f 63 64 20 2a 63 64 3b 0a 09 54 63 6c 5f 49 6e  _cd *cd;..Tcl_In
fd50: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 09 54  terp *interp;..T
fd60: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
fd70: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6d 6d 61  ..Tcl_Obj *comma
fd80: 6e 64 2c 20 2a 63 6f 6d 6d 61 6e 64 5f 74 6f 5f  nd, *command_to_
fd90: 72 75 6e 5f 6f 62 6a 73 5b 35 5d 2c 20 2a 63 6f  run_objs[5], *co
fda0: 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e 3b 0a 09 69  mmand_to_run;..i
fdb0: 6e 74 20 73 65 74 73 6f 63 6b 6f 70 74 5f 72 65  nt setsockopt_re
fdc0: 74 3b 0a 09 69 6e 74 20 70 61 73 73 5f 63 72 65  t;..int pass_cre
fdd0: 64 73 5f 74 72 75 65 20 3d 20 31 3b 0a 09 69 6e  ds_true = 1;..in
fde0: 74 20 66 64 3b 0a 09 69 6e 74 20 73 6f 63 6b 3b  t fd;..int sock;
fdf0: 0a 0a 09 69 66 20 28 28 6d 61 73 6b 20 26 20 54  ...if ((mask & T
fe00: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 21 3d 20  CL_READABLE) != 
fe10: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 7b 0a  TCL_READABLE) {.
fe20: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 09 0a 09  ..return;..}....
fe30: 63 64 20 3d 20 63 64 5f 70 3b 0a 0a 09 66 64 20  cd = cd_p;...fd 
fe40: 3d 20 63 64 2d 3e 66 64 3b 0a 09 69 6e 74 65 72  = cd->fd;..inter
fe50: 70 20 3d 20 63 64 2d 3e 69 6e 74 65 72 70 3b 0a  p = cd->interp;.
fe60: 09 63 6f 6d 6d 61 6e 64 20 3d 20 63 64 2d 3e 63  .command = cd->c
fe70: 6f 6d 6d 61 6e 64 3b 0a 0a 09 73 6f 63 6b 20 3d  ommand;...sock =
fe80: 20 61 63 63 65 70 74 28 66 64 2c 20 4e 55 4c 4c   accept(fd, NULL
fe90: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 6f  , NULL);..if (so
fea0: 63 6b 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  ck < 0) {...retu
feb0: 72 6e 3b 0a 09 7d 0a 0a 09 63 68 61 6e 20 3d 20  rn;..}...chan = 
fec0: 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69  tuapi_socket_uni
fed0: 78 5f 73 6f 63 6b 32 74 63 6c 63 68 61 6e 28 73  x_sock2tclchan(s
fee0: 6f 63 6b 29 3b 0a 09 69 66 20 28 63 68 61 6e 20  ock);..if (chan 
fef0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 6c 6f  == NULL) {...clo
ff00: 73 65 28 73 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  se(sock);....ret
ff10: 75 72 6e 3b 0a 09 7d 0a 0a 09 73 65 74 73 6f 63  urn;..}...setsoc
ff20: 6b 6f 70 74 5f 72 65 74 20 3d 20 73 65 74 73 6f  kopt_ret = setso
ff30: 63 6b 6f 70 74 28 73 6f 63 6b 2c 20 53 4f 4c 5f  ckopt(sock, SOL_
ff40: 53 4f 43 4b 45 54 2c 20 53 4f 5f 50 41 53 53 43  SOCKET, SO_PASSC
ff50: 52 45 44 2c 20 26 70 61 73 73 5f 63 72 65 64 73  RED, &pass_creds
ff60: 5f 74 72 75 65 2c 20 73 69 7a 65 6f 66 28 70 61  _true, sizeof(pa
ff70: 73 73 5f 63 72 65 64 73 5f 74 72 75 65 29 29 3b  ss_creds_true));
ff80: 0a 09 69 66 20 28 73 65 74 73 6f 63 6b 6f 70 74  ..if (setsockopt
ff90: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 63  _ret != 0) {...c
ffa0: 6c 6f 73 65 28 73 6f 63 6b 29 3b 0a 0a 09 09 72  lose(sock);....r
ffb0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  eturn;..}...Tcl_
ffc0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  RegisterChannel(
ffd0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 0a  interp, chan);..
ffe0: 09 63 6f 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e 5f  .command_to_run_
fff0: 6f 62 6a 73 5b 30 5d 20 3d 20 63 6f 6d 6d 61 6e  objs[0] = comman
10000 64 3b 0a 09 63 6f 6d 6d 61 6e 64 5f 74 6f 5f 72  d;..command_to_r
10010 75 6e 5f 6f 62 6a 73 5b 31 5d 20 3d 20 54 63 6c  un_objs[1] = Tcl
10020 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
10030 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
10040 28 63 68 61 6e 29 2c 20 2d 31 29 3b 0a 09 63 6f  (chan), -1);..co
10050 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e 5f 6f 62 6a  mmand_to_run_obj
10060 73 5b 32 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74  s[2] = Tcl_NewSt
10070 72 69 6e 67 4f 62 6a 28 22 2e 2e 2e 75 69 64 2e  ringObj("...uid.
10080 2e 2e 22 2c 20 2d 31 29 3b 20 2f 2a 20 58 58 58  ..", -1); /* XXX
10090 3a 20 54 4f 44 4f 20 2a 2f 0a 09 63 6f 6d 6d 61  : TODO */..comma
100a0 6e 64 5f 74 6f 5f 72 75 6e 5f 6f 62 6a 73 5b 33  nd_to_run_objs[3
100b0 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ] = Tcl_NewStrin
100c0 67 4f 62 6a 28 22 2e 2e 2e 67 69 64 2e 2e 2e 22  gObj("...gid..."
100d0 2c 20 2d 31 29 3b 20 2f 2a 20 58 58 58 3a 20 54  , -1); /* XXX: T
100e0 4f 44 4f 20 2a 2f 0a 09 63 6f 6d 6d 61 6e 64 5f  ODO */..command_
100f0 74 6f 5f 72 75 6e 5f 6f 62 6a 73 5b 34 5d 20 3d  to_run_objs[4] =
10100 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10110 6a 28 22 2e 2e 2e 70 69 64 2e 2e 2e 22 2c 20 2d  j("...pid...", -
10120 31 29 3b 20 2f 2a 20 58 58 58 3a 20 54 4f 44 4f  1); /* XXX: TODO
10130 20 2a 2f 0a 09 63 6f 6d 6d 61 6e 64 5f 74 6f 5f   */..command_to_
10140 72 75 6e 20 3d 20 54 63 6c 5f 43 6f 6e 63 61 74  run = Tcl_Concat
10150 4f 62 6a 28 73 69 7a 65 6f 66 28 63 6f 6d 6d 61  Obj(sizeof(comma
10160 6e 64 5f 74 6f 5f 72 75 6e 5f 6f 62 6a 73 29 20  nd_to_run_objs) 
10170 2f 20 73 69 7a 65 6f 66 28 63 6f 6d 6d 61 6e 64  / sizeof(command
10180 5f 74 6f 5f 72 75 6e 5f 6f 62 6a 73 5b 30 5d 29  _to_run_objs[0])
10190 2c 20 63 6f 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e  , command_to_run
101a0 5f 6f 62 6a 73 29 3b 0a 0a 09 54 63 6c 5f 45 76  _objs);...Tcl_Ev
101b0 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
101c0 63 6f 6d 6d 61 6e 64 5f 74 6f 5f 72 75 6e 2c 20  command_to_run, 
101d0 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
101e0 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73  ;...return;.}..s
101f0 74 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f  tatic int tuapi_
10200 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 73 65 72 76  socket_unix_serv
10210 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64  er(ClientData cd
10220 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
10230 74 65 72 70 2c 20 69 6e 74 20 73 6f 63 6b 2c 20  terp, int sock, 
10240 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
10250 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6d 6d 61  , Tcl_Obj *comma
10260 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 74 75  nd) {..struct tu
10270 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f  api_socket_unix_
10280 5f 63 68 61 6e 5f 61 63 63 65 70 74 5f 63 64 20  _chan_accept_cd 
10290 2a 61 63 63 65 70 74 5f 63 64 3b 0a 09 73 74 72  *accept_cd;..str
102a0 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 75 6e 20  uct sockaddr_un 
102b0 64 65 73 74 3b 0a 09 73 73 69 7a 65 5f 74 20 70  dest;..ssize_t p
102c0 61 74 68 6c 65 6e 3b 0a 09 69 6e 74 20 62 69 6e  athlen;..int bin
102d0 64 5f 72 65 74 2c 20 6c 69 73 74 65 6e 5f 72 65  d_ret, listen_re
102e0 74 3b 0a 0a 09 70 61 74 68 6c 65 6e 20 3d 20 73  t;...pathlen = s
102f0 74 72 6c 65 6e 28 70 61 74 68 29 20 2b 20 31 3b  trlen(path) + 1;
10300 0a 09 69 66 20 28 70 61 74 68 6c 65 6e 20 3c 3d  ..if (pathlen <=
10310 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f   0) {...Tcl_SetO
10320 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10330 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10340 6a 28 22 70 61 74 68 20 74 6f 6f 20 73 68 6f 72  j("path too shor
10350 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74  t", -1));....ret
10360 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
10370 09 7d 0a 0a 09 69 66 20 28 70 61 74 68 6c 65 6e  .}...if (pathlen
10380 20 3e 20 73 69 7a 65 6f 66 28 64 65 73 74 2e 73   > sizeof(dest.s
10390 75 6e 5f 70 61 74 68 29 29 20 7b 0a 09 09 54 63  un_path)) {...Tc
103a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
103b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
103c0 72 69 6e 67 4f 62 6a 28 22 70 61 74 68 20 74 6f  ringObj("path to
103d0 6f 20 6c 6f 6e 67 22 2c 20 2d 31 29 29 3b 0a 0a  o long", -1));..
103e0 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
103f0 4f 52 29 3b 0a 09 7d 0a 0a 09 64 65 73 74 2e 73  OR);..}...dest.s
10400 75 6e 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 55  un_family = AF_U
10410 4e 49 58 3b 0a 09 6d 65 6d 63 70 79 28 64 65 73  NIX;..memcpy(des
10420 74 2e 73 75 6e 5f 70 61 74 68 2c 20 70 61 74 68  t.sun_path, path
10430 2c 20 70 61 74 68 6c 65 6e 29 3b 0a 0a 09 62 69  , pathlen);...bi
10440 6e 64 5f 72 65 74 20 3d 20 62 69 6e 64 28 73 6f  nd_ret = bind(so
10450 63 6b 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b  ck, (struct sock
10460 61 64 64 72 20 2a 29 20 26 64 65 73 74 2c 20 73  addr *) &dest, s
10470 69 7a 65 6f 66 28 64 65 73 74 29 29 3b 0a 09 69  izeof(dest));..i
10480 66 20 28 62 69 6e 64 5f 72 65 74 20 21 3d 20 30  f (bind_ret != 0
10490 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a  ) {...Tcl_SetObj
104a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
104b0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
104c0 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 2c  strerror(errno),
104d0 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e   -1));....return
104e0 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
104f0 0a 09 6c 69 73 74 65 6e 5f 72 65 74 20 3d 20 6c  ..listen_ret = l
10500 69 73 74 65 6e 28 73 6f 63 6b 2c 20 32 29 3b 0a  isten(sock, 2);.
10510 09 69 66 20 28 6c 69 73 74 65 6e 5f 72 65 74 20  .if (listen_ret 
10520 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65  != 0) {...Tcl_Se
10530 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10540 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
10550 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72  Obj(strerror(err
10560 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  no), -1));....re
10570 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10580 0a 09 7d 0a 0a 09 61 63 63 65 70 74 5f 63 64 20  ..}...accept_cd 
10590 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
105a0 2a 61 63 63 65 70 74 5f 63 64 29 29 3b 0a 09 69  *accept_cd));..i
105b0 66 20 28 61 63 63 65 70 74 5f 63 64 20 3d 3d 20  f (accept_cd == 
105c0 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65  NULL) {...Tcl_Se
105d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
105e0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
105f0 4f 62 6a 28 73 74 72 65 72 72 6f 72 28 65 72 72  Obj(strerror(err
10600 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  no), -1));....re
10610 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10620 0a 09 7d 0a 0a 09 61 63 63 65 70 74 5f 63 64 2d  ..}...accept_cd-
10630 3e 66 64 20 3d 20 73 6f 63 6b 3b 0a 09 61 63 63  >fd = sock;..acc
10640 65 70 74 5f 63 64 2d 3e 69 6e 74 65 72 70 20 3d  ept_cd->interp =
10650 20 69 6e 74 65 72 70 3b 0a 09 61 63 63 65 70 74   interp;..accept
10660 5f 63 64 2d 3e 63 6f 6d 6d 61 6e 64 20 3d 20 63  _cd->command = c
10670 6f 6d 6d 61 6e 64 3b 0a 0a 09 54 63 6c 5f 49 6e  ommand;...Tcl_In
10680 63 72 52 65 66 43 6f 75 6e 74 28 63 6f 6d 6d 61  crRefCount(comma
10690 6e 64 29 3b 0a 0a 09 54 63 6c 5f 43 72 65 61 74  nd);...Tcl_Creat
106a0 65 46 69 6c 65 48 61 6e 64 6c 65 72 28 73 6f 63  eFileHandler(soc
106b0 6b 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c  k, TCL_READABLE,
106c0 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75 6e   tuapi_socket_un
106d0 69 78 5f 5f 63 68 61 6e 5f 61 63 63 65 70 74 2c  ix__chan_accept,
106e0 20 61 63 63 65 70 74 5f 63 64 29 3b 0a 0a 09 72   accept_cd);...r
106f0 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d  eturn(TCL_OK);.}
10700 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61  ..static int tua
10710 70 69 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 63  pi_socket_unix_c
10720 6c 69 65 6e 74 28 43 6c 69 65 6e 74 44 61 74 61  lient(ClientData
10730 20 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20   cd, Tcl_Interp 
10740 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 73 6f 63  *interp, int soc
10750 6b 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  k, const char *p
10760 61 74 68 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e  ath) {..Tcl_Chan
10770 6e 65 6c 20 63 68 61 6e 3b 0a 09 73 74 72 75 63  nel chan;..struc
10780 74 20 73 6f 63 6b 61 64 64 72 5f 75 6e 20 64 65  t sockaddr_un de
10790 73 74 3b 0a 09 73 73 69 7a 65 5f 74 20 70 61 74  st;..ssize_t pat
107a0 68 6c 65 6e 3b 0a 09 69 6e 74 20 63 6f 6e 6e 65  hlen;..int conne
107b0 63 74 5f 72 65 74 2c 20 73 65 74 73 6f 63 6b 6f  ct_ret, setsocko
107c0 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 70 61 73  pt_ret;..int pas
107d0 73 5f 63 72 65 64 73 5f 74 72 75 65 20 3d 20 31  s_creds_true = 1
107e0 3b 0a 0a 09 70 61 74 68 6c 65 6e 20 3d 20 73 74  ;...pathlen = st
107f0 72 6c 65 6e 28 70 61 74 68 29 20 2b 20 31 3b 0a  rlen(path) + 1;.
10800 09 69 66 20 28 70 61 74 68 6c 65 6e 20 3c 3d 20  .if (pathlen <= 
10810 30 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  0) {...Tcl_SetOb
10820 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10830 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10840 28 22 70 61 74 68 20 74 6f 6f 20 73 68 6f 72 74  ("path too short
10850 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75  ", -1));....retu
10860 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
10870 7d 0a 0a 09 69 66 20 28 70 61 74 68 6c 65 6e 20  }...if (pathlen 
10880 3e 20 73 69 7a 65 6f 66 28 64 65 73 74 2e 73 75  > sizeof(dest.su
10890 6e 5f 70 61 74 68 29 29 20 7b 0a 09 09 54 63 6c  n_path)) {...Tcl
108a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
108b0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
108c0 69 6e 67 4f 62 6a 28 22 70 61 74 68 20 74 6f 6f  ingObj("path too
108d0 20 6c 6f 6e 67 22 2c 20 2d 31 29 29 3b 0a 0a 09   long", -1));...
108e0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
108f0 52 29 3b 0a 09 7d 0a 0a 09 64 65 73 74 2e 73 75  R);..}...dest.su
10900 6e 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 55 4e  n_family = AF_UN
10910 49 58 3b 0a 09 6d 65 6d 63 70 79 28 64 65 73 74  IX;..memcpy(dest
10920 2e 73 75 6e 5f 70 61 74 68 2c 20 70 61 74 68 2c  .sun_path, path,
10930 20 70 61 74 68 6c 65 6e 29 3b 0a 0a 09 63 6f 6e   pathlen);...con
10940 6e 65 63 74 5f 72 65 74 20 3d 20 63 6f 6e 6e 65  nect_ret = conne
10950 63 74 28 73 6f 63 6b 2c 20 28 73 74 72 75 63 74  ct(sock, (struct
10960 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 64 65   sockaddr *) &de
10970 73 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 29  st, sizeof(dest)
10980 29 3b 0a 09 69 66 20 28 63 6f 6e 6e 65 63 74 5f  );..if (connect_
10990 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63  ret != 0) {...Tc
109a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
109b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
109c0 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f 72  ringObj(strerror
109d0 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a 0a  (errno), -1));..
109e0 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
109f0 4f 52 29 3b 0a 09 7d 0a 0a 09 73 65 74 73 6f 63  OR);..}...setsoc
10a00 6b 6f 70 74 5f 72 65 74 20 3d 20 73 65 74 73 6f  kopt_ret = setso
10a10 63 6b 6f 70 74 28 73 6f 63 6b 2c 20 53 4f 4c 5f  ckopt(sock, SOL_
10a20 53 4f 43 4b 45 54 2c 20 53 4f 5f 50 41 53 53 43  SOCKET, SO_PASSC
10a30 52 45 44 2c 20 26 70 61 73 73 5f 63 72 65 64 73  RED, &pass_creds
10a40 5f 74 72 75 65 2c 20 73 69 7a 65 6f 66 28 70 61  _true, sizeof(pa
10a50 73 73 5f 63 72 65 64 73 5f 74 72 75 65 29 29 3b  ss_creds_true));
10a60 0a 09 69 66 20 28 73 65 74 73 6f 63 6b 6f 70 74  ..if (setsockopt
10a70 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 54  _ret != 0) {...T
10a80 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10a90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
10aa0 74 72 69 6e 67 4f 62 6a 28 73 74 72 65 72 72 6f  tringObj(strerro
10ab0 72 28 65 72 72 6e 6f 29 2c 20 2d 31 29 29 3b 0a  r(errno), -1));.
10ac0 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
10ad0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 68 61 6e 20  ROR);..}...chan 
10ae0 3d 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f 75  = tuapi_socket_u
10af0 6e 69 78 5f 73 6f 63 6b 32 74 63 6c 63 68 61 6e  nix_sock2tclchan
10b00 28 73 6f 63 6b 29 3b 0a 09 69 66 20 28 63 68 61  (sock);..if (cha
10b10 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54  n == NULL) {...T
10b20 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10b30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
10b40 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65  tringObj("unable
10b50 20 74 6f 20 63 72 65 61 74 65 20 54 63 6c 20 63   to create Tcl c
10b60 68 61 6e 6e 65 6c 22 2c 20 2d 31 29 29 3b 0a 0a  hannel", -1));..
10b70 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
10b80 4f 52 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 52 65  OR);..}...Tcl_Re
10b90 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e  gisterChannel(in
10ba0 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 0a 09 54  terp, chan);...T
10bb0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10bc0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
10bd0 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
10be0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
10bf0 29 2c 20 2d 31 29 29 3b 0a 0a 09 72 65 74 75 72  ), -1));...retur
10c00 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(TCL_OK);.}..st
10c10 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 73  atic int tuapi_s
10c20 6f 63 6b 65 74 5f 75 6e 69 78 28 43 6c 69 65 6e  ocket_unix(Clien
10c30 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
10c40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
10c50 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
10c60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
10c70 0a 09 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 5f  ..Tcl_Obj *path_
10c80 6f 62 6a 2c 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 62  obj, *command_ob
10c90 6a 3b 0a 09 63 68 61 72 20 2a 70 61 74 68 3b 0a  j;..char *path;.
10ca0 09 69 6e 74 20 72 65 74 76 61 6c 3b 0a 09 69 6e  .int retval;..in
10cb0 74 20 73 6f 63 6b 3b 0a 0a 09 69 66 20 28 6f 62  t sock;...if (ob
10cc0 6a 63 20 3c 20 32 29 20 7b 0a 09 09 54 63 6c 5f  jc < 2) {...Tcl_
10cd0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10ce0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
10cf0 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61  ngObj("wrong # a
10d00 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
10d10 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  "::tuapi::syscal
10d20 6c 3a 3a 73 6f 63 6b 65 74 5f 75 6e 69 78 20 70  l::socket_unix p
10d30 61 74 68 5c 22 20 6f 72 20 5c 22 3a 3a 74 75 61  ath\" or \"::tua
10d40 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 6f 63  pi::syscall::soc
10d50 6b 65 74 5f 75 6e 69 78 20 2d 73 65 72 76 65 72  ket_unix -server
10d60 20 63 6f 6d 6d 61 6e 64 20 70 61 74 68 5c 22 22   command path\""
10d70 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72  , -1));....retur
10d80 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
10d90 0a 0a 09 70 61 74 68 5f 6f 62 6a 20 3d 20 6f 62  ...path_obj = ob
10da0 6a 76 5b 31 5d 3b 0a 09 70 61 74 68 20 3d 20 54  jv[1];..path = T
10db0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 61 74  cl_GetString(pat
10dc0 68 5f 6f 62 6a 29 3b 0a 0a 09 73 6f 63 6b 20 3d  h_obj);...sock =
10dd0 20 73 6f 63 6b 65 74 28 41 46 5f 55 4e 49 58 2c   socket(AF_UNIX,
10de0 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29   SOCK_STREAM, 0)
10df0 3b 0a 09 69 66 20 28 73 6f 63 6b 20 3d 3d 20 2d  ;..if (sock == -
10e00 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62  1) {...Tcl_SetOb
10e10 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10e20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10e30 28 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29  (strerror(errno)
10e40 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65 74 75 72  , -1));....retur
10e50 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
10e60 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 70 61  ...if (strcmp(pa
10e70 74 68 2c 20 22 2d 73 65 72 76 65 72 22 29 20 3d  th, "-server") =
10e80 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 6f 62 6a  = 0) {...if (obj
10e90 63 20 21 3d 20 34 29 20 7b 0a 09 09 09 54 63 6c  c != 4) {....Tcl
10ea0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
10eb0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
10ec0 69 6e 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20  ingObj("wrong # 
10ed0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10ee0 5c 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61  \"::tuapi::sysca
10ef0 6c 6c 3a 3a 73 6f 63 6b 65 74 5f 75 6e 69 78 20  ll::socket_unix 
10f00 2d 73 65 72 76 65 72 20 63 6f 6d 6d 61 6e 64 20  -server command 
10f10 70 61 74 68 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a  path\"", -1));..
10f20 09 09 09 63 6c 6f 73 65 28 73 6f 63 6b 29 3b 0a  ...close(sock);.
10f30 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
10f40 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 63 6f  RROR);...}....co
10f50 6d 6d 61 6e 64 5f 6f 62 6a 20 3d 20 6f 62 6a 76  mmand_obj = objv
10f60 5b 32 5d 3b 0a 09 09 70 61 74 68 5f 6f 62 6a 20  [2];...path_obj 
10f70 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 0a 09 09 70 61  = objv[3];....pa
10f80 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  th = Tcl_GetStri
10f90 6e 67 28 70 61 74 68 5f 6f 62 6a 29 3b 0a 0a 09  ng(path_obj);...
10fa0 09 72 65 74 76 61 6c 20 3d 20 74 75 61 70 69 5f  .retval = tuapi_
10fb0 73 6f 63 6b 65 74 5f 75 6e 69 78 5f 73 65 72 76  socket_unix_serv
10fc0 65 72 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 73  er(cd, interp, s
10fd0 6f 63 6b 2c 20 70 61 74 68 2c 20 63 6f 6d 6d 61  ock, path, comma
10fe0 6e 64 5f 6f 62 6a 29 3b 0a 09 7d 20 65 6c 73 65  nd_obj);..} else
10ff0 20 7b 0a 09 09 69 66 20 28 6f 62 6a 63 20 21 3d   {...if (objc !=
11000 20 32 29 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74   2) {....Tcl_Set
11010 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11020 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11030 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72 67 73  bj("wrong # args
11040 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a  : should be \"::
11050 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a  tuapi::syscall::
11060 73 6f 63 6b 65 74 5f 75 6e 69 78 20 70 61 74 68  socket_unix path
11070 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09 63  \"", -1));.....c
11080 6c 6f 73 65 28 73 6f 63 6b 29 3b 0a 0a 09 09 09  lose(sock);.....
11090 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
110a0 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 76 61 6c  );...}....retval
110b0 20 3d 20 74 75 61 70 69 5f 73 6f 63 6b 65 74 5f   = tuapi_socket_
110c0 75 6e 69 78 5f 63 6c 69 65 6e 74 28 63 64 2c 20  unix_client(cd, 
110d0 69 6e 74 65 72 70 2c 20 73 6f 63 6b 2c 20 70 61  interp, sock, pa
110e0 74 68 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  th);..}...if (re
110f0 74 76 61 6c 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  tval != TCL_OK) 
11100 7b 0a 09 09 63 6c 6f 73 65 28 73 6f 63 6b 29 3b  {...close(sock);
11110 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
11120 76 61 6c 29 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74  val);.}.#else.st
11130 61 74 69 63 20 69 6e 74 20 74 75 61 70 69 5f 73  atic int tuapi_s
11140 6f 63 6b 65 74 5f 75 6e 69 78 28 43 6c 69 65 6e  ocket_unix(Clien
11150 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
11160 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
11170 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
11180 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
11190 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
111a0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
111b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 74  ewStringObj("not
111c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 2c 20 2d   implemented", -
111d0 31 29 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  1));..return(TCL
111e0 5f 45 52 52 4f 52 29 0a 7d 0a 23 65 6e 64 69 66  _ERROR).}.#endif
111f0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 75 61  ..static int tua
11200 70 69 5f 74 73 6d 66 5f 73 74 61 72 74 5f 73 76  pi_tsmf_start_sv
11210 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c  c(ClientData cd,
11220 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11230 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
11240 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11250 6a 76 5b 5d 29 20 7b 0a 09 73 74 72 75 63 74 20  jv[]) {..struct 
11260 74 69 6d 65 76 61 6c 20 73 65 6c 65 63 74 5f 74  timeval select_t
11270 69 6d 65 6f 75 74 3b 0a 09 54 63 6c 5f 57 69 64  imeout;..Tcl_Wid
11280 65 49 6e 74 20 75 6d 61 73 6b 5f 76 61 6c 2c 20  eInt umask_val, 
11290 74 69 6d 65 6f 75 74 5f 76 61 6c 2c 20 75 69 64  timeout_val, uid
112a0 5f 76 61 6c 2c 20 67 69 64 5f 76 61 6c 3b 0a 09  _val, gid_val;..
112b0 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61 6d  Tcl_Obj *filenam
112c0 65 5f 6f 62 6a 2c 20 2a 65 6e 76 5f 6f 62 6a 2c  e_obj, *env_obj,
112d0 20 2a 6c 6f 67 66 69 6c 65 5f 6f 62 6a 2c 20 2a   *logfile_obj, *
112e0 2a 65 6e 76 5f 65 6e 74 72 79 5f 6f 62 6a 76 2c  *env_entry_objv,
112f0 20 2a 63 77 64 5f 6f 62 6a 2c 20 2a 75 6d 61 73   *cwd_obj, *umas
11300 6b 5f 6f 62 6a 2c 20 2a 75 69 64 5f 6f 62 6a 2c  k_obj, *uid_obj,
11310 20 2a 67 69 64 5f 6f 62 6a 3b 0a 09 54 63 6c 5f   *gid_obj;..Tcl_
11320 4f 62 6a 20 2a 73 72 69 5f 6f 62 6a 2c 20 2a 74  Obj *sri_obj, *t
11330 69 6d 65 6f 75 74 5f 6f 62 6a 3b 0a 09 70 69 64  imeout_obj;..pid
11340 5f 74 20 63 68 69 6c 64 2c 20 63 68 69 6c 64 5f  _t child, child_
11350 70 67 69 64 20 3d 20 2d 31 2c 20 77 61 69 74 70  pgid = -1, waitp
11360 69 64 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f 74  id_ret;..ssize_t
11370 20 72 65 61 64 5f 72 65 74 3b 0a 09 74 69 6d 65   read_ret;..time
11380 5f 74 20 63 75 72 72 74 69 6d 65 3b 0a 09 63 68  _t currtime;..ch
11390 61 72 20 2a 61 72 67 76 5b 33 5d 2c 20 2a 65 6e  ar *argv[3], *en
113a0 76 76 5b 35 31 32 5d 3b 0a 09 63 68 61 72 20 2a  vv[512];..char *
113b0 6c 6f 67 66 69 6c 65 2c 20 2a 66 69 6c 65 6e 61  logfile, *filena
113c0 6d 65 2c 20 2a 63 77 64 3b 0a 09 63 68 61 72 20  me, *cwd;..char 
113d0 6c 6f 67 6d 73 67 5b 32 30 34 38 5d 3b 0a 09 66  logmsg[2048];..f
113e0 64 5f 73 65 74 20 72 65 61 64 5f 66 64 73 65 74  d_set read_fdset
113f0 3b 0a 09 69 6e 74 20 70 69 70 65 5f 72 65 74 2c  ;..int pipe_ret,
11400 20 73 65 74 73 69 64 5f 72 65 74 2c 20 65 78 65   setsid_ret, exe
11410 63 76 65 5f 72 65 74 2c 20 74 63 6c 5f 72 65 74  cve_ret, tcl_ret
11420 2c 20 73 65 6c 65 63 74 5f 72 65 74 2c 20 63 68  , select_ret, ch
11430 64 69 72 5f 72 65 74 3b 0a 09 69 6e 74 20 6e 75  dir_ret;..int nu
11440 6c 6c 5f 66 64 2c 20 6c 6f 67 5f 66 64 2c 20 74  ll_fd, log_fd, t
11450 6d 70 5f 66 64 2c 20 6d 61 78 5f 66 64 3b 0a 09  mp_fd, max_fd;..
11460 69 6e 74 20 65 6e 76 5f 65 6e 74 72 79 5f 6f 62  int env_entry_ob
11470 6a 63 3b 0a 09 69 6e 74 20 66 64 73 5b 32 5d 2c  jc;..int fds[2],
11480 20 66 64 3b 0a 09 69 6e 74 20 73 74 61 74 75 73   fd;..int status
11490 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 2f 2a  ;..int idx;.../*
114a0 20 31 2e 20 50 61 72 73 65 20 61 72 67 75 6d 65   1. Parse argume
114b0 6e 74 73 20 2a 2f 0a 09 2f 2a 20 31 2e 61 2e 20  nts */../* 1.a. 
114c0 45 6e 73 75 72 65 20 74 68 65 20 63 6f 72 72 65  Ensure the corre
114d0 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ct number of arg
114e0 75 6d 65 6e 74 73 20 77 65 72 65 20 70 61 73 73  uments were pass
114f0 65 64 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20  ed */..if (objc 
11500 21 3d 20 31 30 29 20 7b 0a 09 09 54 63 6c 5f 53  != 10) {...Tcl_S
11510 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11520 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
11530 67 4f 62 6a 28 22 77 72 6f 6e 67 20 23 20 61 72  gObj("wrong # ar
11540 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
11550 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c  ::tuapi::syscall
11560 3a 3a 74 73 6d 66 5f 73 74 61 72 74 5f 73 76 63  ::tsmf_start_svc
11570 20 73 72 69 20 66 69 6c 65 6e 61 6d 65 20 6c 6f   sri filename lo
11580 67 66 69 6c 65 20 65 6e 76 20 63 77 64 20 75 6d  gfile env cwd um
11590 61 73 6b 20 75 69 64 20 67 69 64 20 74 69 6d 65  ask uid gid time
115a0 6f 75 74 5c 22 22 2c 20 2d 31 29 29 3b 0a 0a 09  out\"", -1));...
115b0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
115c0 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 31 2e 62 2e  R);..}.../* 1.b.
115d0 20 49 64 65 6e 74 69 66 79 20 54 63 6c 5f 4f 62   Identify Tcl_Ob
115e0 6a 73 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61  js to use for ea
115f0 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 09  ch argument */..
11600 73 72 69 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 31  sri_obj = objv[1
11610 5d 3b 0a 09 66 69 6c 65 6e 61 6d 65 5f 6f 62 6a  ];..filename_obj
11620 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 6c 6f 67   = objv[2];..log
11630 66 69 6c 65 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b  file_obj = objv[
11640 33 5d 3b 0a 09 65 6e 76 5f 6f 62 6a 20 3d 20 6f  3];..env_obj = o
11650 62 6a 76 5b 34 5d 3b 0a 09 63 77 64 5f 6f 62 6a  bjv[4];..cwd_obj
11660 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 09 75 6d 61   = objv[5];..uma
11670 73 6b 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 36 5d  sk_obj = objv[6]
11680 3b 0a 09 75 69 64 5f 6f 62 6a 20 3d 20 6f 62 6a  ;..uid_obj = obj
11690 76 5b 37 5d 3b 0a 09 67 69 64 5f 6f 62 6a 20 3d  v[7];..gid_obj =
116a0 20 6f 62 6a 76 5b 38 5d 3b 0a 09 74 69 6d 65 6f   objv[8];..timeo
116b0 75 74 5f 6f 62 6a 20 3d 20 6f 62 6a 76 5b 39 5d  ut_obj = objv[9]
116c0 3b 0a 0a 09 2f 2a 20 31 2e 63 2e 20 53 74 6f 72  ;.../* 1.c. Stor
116d0 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e  e string argumen
116e0 74 73 20 2a 2f 0a 09 66 69 6c 65 6e 61 6d 65 20  ts */..filename 
116f0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
11700 66 69 6c 65 6e 61 6d 65 5f 6f 62 6a 29 3b 0a 09  filename_obj);..
11710 6c 6f 67 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65  logfile = Tcl_Ge
11720 74 53 74 72 69 6e 67 28 6c 6f 67 66 69 6c 65 5f  tString(logfile_
11730 6f 62 6a 29 3b 0a 09 63 77 64 20 3d 20 54 63 6c  obj);..cwd = Tcl
11740 5f 47 65 74 53 74 72 69 6e 67 28 63 77 64 5f 6f  _GetString(cwd_o
11750 62 6a 29 3b 0a 0a 09 2f 2a 20 31 2e 64 2e 20 49  bj);.../* 1.d. I
11760 6e 74 65 67 65 72 20 6f 62 6a 65 63 74 73 20 2a  nteger objects *
11770 2f 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c  /..tcl_ret = Tcl
11780 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
11790 62 6a 28 69 6e 74 65 72 70 2c 20 75 6d 61 73 6b  bj(interp, umask
117a0 5f 6f 62 6a 2c 20 26 75 6d 61 73 6b 5f 76 61 6c  _obj, &umask_val
117b0 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20  );..if (tcl_ret 
117c0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72  != TCL_OK) {...r
117d0 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29 3b 0a  eturn(tcl_ret);.
117e0 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54  .}...tcl_ret = T
117f0 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
11800 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 74 69 6d  mObj(interp, tim
11810 65 6f 75 74 5f 6f 62 6a 2c 20 26 74 69 6d 65 6f  eout_obj, &timeo
11820 75 74 5f 76 61 6c 29 3b 0a 09 69 66 20 28 74 63  ut_val);..if (tc
11830 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  l_ret != TCL_OK)
11840 20 7b 0a 09 09 72 65 74 75 72 6e 28 74 63 6c 5f   {...return(tcl_
11850 72 65 74 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72  ret);..}...tcl_r
11860 65 74 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  et = Tcl_GetWide
11870 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
11880 70 2c 20 75 69 64 5f 6f 62 6a 2c 20 26 75 69 64  p, uid_obj, &uid
11890 5f 76 61 6c 29 3b 0a 09 69 66 20 28 74 63 6c 5f  _val);..if (tcl_
118a0 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ret != TCL_OK) {
118b0 0a 09 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65  ...return(tcl_re
118c0 74 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74  t);..}...tcl_ret
118d0 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e   = Tcl_GetWideIn
118e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
118f0 20 67 69 64 5f 6f 62 6a 2c 20 26 67 69 64 5f 76   gid_obj, &gid_v
11900 61 6c 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65  al);..if (tcl_re
11910 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
11920 09 72 65 74 75 72 6e 28 74 63 6c 5f 72 65 74 29  .return(tcl_ret)
11930 3b 0a 09 7d 0a 0a 09 2f 2a 20 31 2e 65 2e 20 50  ;..}.../* 1.e. P
11940 72 6f 63 65 73 73 20 65 6e 76 69 72 6f 6e 6d 65  rocess environme
11950 6e 74 20 2a 2f 0a 09 74 63 6c 5f 72 65 74 20 3d  nt */..tcl_ret =
11960 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45   Tcl_ListObjGetE
11970 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
11980 65 6e 76 5f 6f 62 6a 2c 20 26 65 6e 76 5f 65 6e  env_obj, &env_en
11990 74 72 79 5f 6f 62 6a 63 2c 20 26 65 6e 76 5f 65  try_objc, &env_e
119a0 6e 74 72 79 5f 6f 62 6a 76 29 3b 0a 09 69 66 20  ntry_objv);..if 
119b0 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f  (tcl_ret != TCL_
119c0 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 74  OK) {...return(t
119d0 63 6c 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 66 6f  cl_ret);..}...fo
119e0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
119f0 3c 20 4d 49 4e 28 65 6e 76 5f 65 6e 74 72 79 5f  < MIN(env_entry_
11a00 6f 62 6a 63 2c 20 73 69 7a 65 6f 66 28 65 6e 76  objc, sizeof(env
11a10 76 29 20 2f 20 73 69 7a 65 6f 66 28 65 6e 76 76  v) / sizeof(envv
11a20 5b 30 5d 29 20 2d 20 31 29 3b 20 69 64 78 2b 2b  [0]) - 1); idx++
11a30 29 20 7b 0a 09 09 65 6e 76 76 5b 69 64 78 5d 20  ) {...envv[idx] 
11a40 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
11a50 65 6e 76 5f 65 6e 74 72 79 5f 6f 62 6a 76 5b 69  env_entry_objv[i
11a60 64 78 5d 29 3b 0a 09 7d 0a 09 65 6e 76 76 5b 69  dx]);..}..envv[i
11a70 64 78 5d 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2a  dx] = NULL;.../*
11a80 20 32 2e 20 43 72 65 61 74 65 20 61 20 70 69 70   2. Create a pip
11a90 65 20 66 6f 72 20 63 6f 6d 6d 75 6e 69 63 61 74  e for communicat
11aa0 69 6f 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ion between the 
11ab0 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 09 70 69  processes */..pi
11ac0 70 65 5f 72 65 74 20 3d 20 70 69 70 65 28 66 64  pe_ret = pipe(fd
11ad0 73 29 3b 0a 09 69 66 20 28 70 69 70 65 5f 72 65  s);..if (pipe_re
11ae0 74 20 21 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  t != 0) {...Tcl_
11af0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11b00 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
11b10 6e 67 4f 62 6a 28 22 70 69 70 65 20 66 61 69 6c  ngObj("pipe fail
11b20 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 72 65  ed", -1));....re
11b30 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
11b40 0a 09 7d 0a 0a 09 2f 2a 20 33 2e 20 46 6f 72 6b  ..}.../* 3. Fork
11b50 20 69 6e 74 6f 20 61 20 6e 65 77 20 70 72 6f 63   into a new proc
11b60 65 73 73 20 2a 2f 0a 09 63 68 69 6c 64 20 3d 20  ess */..child = 
11b70 66 6f 72 6b 28 29 3b 0a 09 69 66 20 28 63 68 69  fork();..if (chi
11b80 6c 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 54 63  ld == -1) {...Tc
11b90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11ba0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
11bb0 72 69 6e 67 4f 62 6a 28 22 66 6f 72 6b 20 66 61  ringObj("fork fa
11bc0 69 6c 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 09  iled", -1));....
11bd0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
11be0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 68 69 6c  );..}...if (chil
11bf0 64 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 34  d != 0) {.../* 4
11c00 2e 70 61 72 65 6e 74 2e 20 47 65 74 20 50 47 49  .parent. Get PGI
11c10 44 20 66 72 6f 6d 20 63 68 69 6c 64 20 2a 2f 0a  D from child */.
11c20 09 09 2f 2a 20 34 2e 70 61 72 65 6e 74 2e 61 2e  ../* 4.parent.a.
11c30 20 4f 70 65 6e 20 6c 6f 67 20 66 69 6c 65 20 2a   Open log file *
11c40 2f 0a 09 09 6c 6f 67 5f 66 64 20 3d 20 6f 70 65  /...log_fd = ope
11c50 6e 28 6c 6f 67 66 69 6c 65 2c 20 4f 5f 57 52 4f  n(logfile, O_WRO
11c60 4e 4c 59 20 7c 20 4f 5f 43 52 45 41 54 20 7c 20  NLY | O_CREAT | 
11c70 4f 5f 41 50 50 45 4e 44 2c 20 53 5f 49 52 55 53  O_APPEND, S_IRUS
11c80 52 20 7c 20 53 5f 49 57 55 53 52 20 7c 20 53 5f  R | S_IWUSR | S_
11c90 49 52 47 52 50 20 7c 20 53 5f 49 52 4f 54 48 29  IRGRP | S_IROTH)
11ca0 3b 0a 0a 09 09 2f 2a 20 34 2e 70 61 72 65 6e 74  ;..../* 4.parent
11cb0 2e 62 2e 20 43 6c 6f 73 65 20 77 72 69 74 65 20  .b. Close write 
11cc0 65 6e 64 20 6f 66 20 70 69 70 65 20 2d 2d 20 77  end of pipe -- w
11cd0 65 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  e are read-only 
11ce0 2a 2f 0a 09 09 63 6c 6f 73 65 28 66 64 73 5b 31  */...close(fds[1
11cf0 5d 29 3b 0a 09 09 66 64 20 3d 20 66 64 73 5b 30  ]);...fd = fds[0
11d00 5d 3b 0a 0a 09 09 2f 2a 20 34 2e 70 61 72 65 6e  ];..../* 4.paren
11d10 74 2e 63 2e 20 52 65 61 64 20 70 72 6f 63 65 73  t.c. Read proces
11d20 73 20 67 72 6f 75 70 20 49 44 20 6f 66 20 63 68  s group ID of ch
11d30 69 6c 64 20 66 72 6f 6d 20 70 69 70 65 20 2a 2f  ild from pipe */
11d40 0a 09 09 73 65 6c 65 63 74 5f 74 69 6d 65 6f 75  ...select_timeou
11d50 74 2e 74 76 5f 73 65 63 20 3d 20 74 69 6d 65 6f  t.tv_sec = timeo
11d60 75 74 5f 76 61 6c 3b 0a 09 09 73 65 6c 65 63 74  ut_val;...select
11d70 5f 74 69 6d 65 6f 75 74 2e 74 76 5f 75 73 65 63  _timeout.tv_usec
11d80 20 3d 20 30 3b 0a 0a 09 09 46 44 5f 5a 45 52 4f   = 0;....FD_ZERO
11d90 28 26 72 65 61 64 5f 66 64 73 65 74 29 3b 0a 09  (&read_fdset);..
11da0 09 46 44 5f 53 45 54 28 66 64 2c 20 26 72 65 61  .FD_SET(fd, &rea
11db0 64 5f 66 64 73 65 74 29 3b 0a 0a 09 09 73 65 6c  d_fdset);....sel
11dc0 65 63 74 5f 72 65 74 20 3d 20 73 65 6c 65 63 74  ect_ret = select
11dd0 28 66 64 20 2b 20 31 2c 20 26 72 65 61 64 5f 66  (fd + 1, &read_f
11de0 64 73 65 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  dset, NULL, NULL
11df0 2c 20 26 73 65 6c 65 63 74 5f 74 69 6d 65 6f 75  , &select_timeou
11e00 74 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74  t);...if (select
11e10 5f 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09  _ret == 0) {....
11e20 2f 2a 20 4f 6e 20 74 69 6d 65 6f 75 74 2c 20 74  /* On timeout, t
11e30 65 72 6d 69 6e 61 74 65 20 73 74 61 72 74 69 6e  erminate startin
11e40 67 20 70 72 6f 63 65 73 73 20 2a 2f 0a 09 09 09  g process */....
11e50 63 68 69 6c 64 5f 70 67 69 64 20 3d 20 67 65 74  child_pgid = get
11e60 70 67 69 64 28 63 68 69 6c 64 29 3b 0a 09 09 09  pgid(child);....
11e70 69 66 20 28 63 68 69 6c 64 5f 70 67 69 64 20 21  if (child_pgid !
11e80 3d 20 2d 31 29 20 7b 0a 09 09 09 09 6b 69 6c 6c  = -1) {.....kill
11e90 28 2d 63 68 69 6c 64 5f 70 67 69 64 2c 20 53 49  (-child_pgid, SI
11ea0 47 4b 49 4c 4c 29 3b 0a 09 09 09 7d 0a 0a 09 09  GKILL);....}....
11eb0 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
11ec0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11ed0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65  wStringObj("time
11ee0 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  out", -1));.....
11ef0 63 75 72 72 74 69 6d 65 20 3d 20 74 69 6d 65 28  currtime = time(
11f00 4e 55 4c 4c 29 3b 0a 09 09 09 73 74 72 66 74 69  NULL);....strfti
11f10 6d 65 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f  me(logmsg, sizeo
11f20 66 28 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62  f(logmsg), "[ %b
11f30 20 25 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20   %e %H:%M:%S ", 
11f40 6c 6f 63 61 6c 74 69 6d 65 28 26 63 75 72 72 74  localtime(&currt
11f50 69 6d 65 29 29 3b 0a 09 09 09 77 72 69 74 65 28  ime));....write(
11f60 6c 6f 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20  log_fd, logmsg, 
11f70 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b  strlen(logmsg));
11f80 0a 0a 09 09 09 73 6e 70 72 69 6e 74 66 28 6c 6f  .....snprintf(lo
11f90 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67  gmsg, sizeof(log
11fa0 6d 73 67 29 2c 20 22 4d 65 74 68 6f 64 20 5c 22  msg), "Method \"
11fb0 73 74 61 72 74 5c 22 20 74 69 6d 65 64 20 6f 75  start\" timed ou
11fc0 74 20 61 66 74 65 72 20 25 69 20 73 65 63 6f 6e  t after %i secon
11fd0 64 73 20 5d 5c 6e 22 2c 20 28 69 6e 74 29 20 74  ds ]\n", (int) t
11fe0 69 6d 65 6f 75 74 5f 76 61 6c 29 3b 0a 09 09 09  imeout_val);....
11ff0 77 72 69 74 65 28 6c 6f 67 5f 66 64 2c 20 6c 6f  write(log_fd, lo
12000 67 6d 73 67 2c 20 73 74 72 6c 65 6e 28 6c 6f 67  gmsg, strlen(log
12010 6d 73 67 29 29 3b 0a 0a 09 09 09 63 6c 6f 73 65  msg));.....close
12020 28 6c 6f 67 5f 66 64 29 3b 0a 0a 09 09 09 72 65  (log_fd);.....re
12030 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
12040 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6c 65  ...}....if (sele
12050 63 74 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  ct_ret > 0) {...
12060 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64  .read_ret = read
12070 28 66 64 2c 20 26 63 68 69 6c 64 5f 70 67 69 64  (fd, &child_pgid
12080 2c 20 73 69 7a 65 6f 66 28 63 68 69 6c 64 5f 70  , sizeof(child_p
12090 67 69 64 29 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  gid));...}..../*
120a0 20 34 2e 70 61 72 65 6e 74 2e 64 2e 20 43 6c 6f   4.parent.d. Clo
120b0 73 65 20 72 65 61 64 20 65 6e 64 20 6f 66 20 70  se read end of p
120c0 69 70 65 20 2a 2f 0a 09 09 63 6c 6f 73 65 28 66  ipe */...close(f
120d0 64 29 3b 0a 0a 09 09 2f 2a 20 34 2e 70 61 72 65  d);..../* 4.pare
120e0 6e 74 2e 65 2e 20 56 65 72 69 66 79 20 72 65 61  nt.e. Verify rea
120f0 64 20 77 61 73 20 6d 65 61 6e 69 6e 67 66 75 6c  d was meaningful
12100 20 2a 2f 0a 09 09 69 66 20 28 72 65 61 64 5f 72   */...if (read_r
12110 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 63 68 69  et != sizeof(chi
12120 6c 64 5f 70 67 69 64 29 29 20 7b 0a 09 09 09 54  ld_pgid)) {....T
12130 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
12140 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
12150 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 65 64  tringObj("failed
12160 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
12170 77 69 74 68 20 73 74 61 72 74 65 64 20 73 65 72  with started ser
12180 76 69 63 65 22 2c 20 2d 31 29 29 3b 0a 0a 09 09  vice", -1));....
12190 09 63 75 72 72 74 69 6d 65 20 3d 20 74 69 6d 65  .currtime = time
121a0 28 4e 55 4c 4c 29 3b 0a 09 09 09 73 74 72 66 74  (NULL);....strft
121b0 69 6d 65 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65  ime(logmsg, size
121c0 6f 66 28 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25  of(logmsg), "[ %
121d0 62 20 25 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c  b %e %H:%M:%S ",
121e0 20 6c 6f 63 61 6c 74 69 6d 65 28 26 63 75 72 72   localtime(&curr
121f0 74 69 6d 65 29 29 3b 0a 09 09 09 77 72 69 74 65  time));....write
12200 28 6c 6f 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c  (log_fd, logmsg,
12210 20 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29   strlen(logmsg))
12220 3b 0a 0a 09 09 09 73 6e 70 72 69 6e 74 66 28 6c  ;.....snprintf(l
12230 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f  ogmsg, sizeof(lo
12240 67 6d 73 67 29 2c 20 22 4d 65 74 68 6f 64 20 5c  gmsg), "Method \
12250 22 73 74 61 72 74 5c 22 20 66 61 69 6c 65 64 3a  "start\" failed:
12260 20 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 77   communication w
12270 69 74 68 20 73 74 61 72 74 65 64 20 73 65 72 76  ith started serv
12280 69 63 65 20 62 72 6f 6b 65 6e 20 5d 5c 6e 22 29  ice broken ]\n")
12290 3b 0a 09 09 09 77 72 69 74 65 28 6c 6f 67 5f 66  ;....write(log_f
122a0 64 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72 6c 65  d, logmsg, strle
122b0 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09 09 09  n(logmsg));.....
122c0 63 6c 6f 73 65 28 6c 6f 67 5f 66 64 29 3b 0a 0a  close(log_fd);..
122d0 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
122e0 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  ROR);...}..../* 
122f0 34 2e 70 61 72 65 6e 74 2e 66 2e 20 49 66 20 74  4.parent.f. If t
12300 68 65 20 50 47 49 44 20 67 69 76 65 6e 20 69 73  he PGID given is
12310 20 61 63 74 75 61 6c 6c 79 20 61 6e 20 65 72 72   actually an err
12320 6f 72 2c 20 72 65 74 75 72 6e 20 65 72 72 6f 72  or, return error
12330 20 2a 2f 0a 09 09 69 66 20 28 63 68 69 6c 64 5f   */...if (child_
12340 70 67 69 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09  pgid == -1) {...
12350 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
12360 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
12370 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76  wStringObj("serv
12380 69 63 65 20 66 61 69 6c 65 64 20 74 6f 20 73 74  ice failed to st
12390 61 72 74 22 2c 20 2d 31 29 29 3b 0a 0a 09 09 09  art", -1));.....
123a0 63 75 72 72 74 69 6d 65 20 3d 20 74 69 6d 65 28  currtime = time(
123b0 4e 55 4c 4c 29 3b 0a 09 09 09 73 74 72 66 74 69  NULL);....strfti
123c0 6d 65 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f  me(logmsg, sizeo
123d0 66 28 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62  f(logmsg), "[ %b
123e0 20 25 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20   %e %H:%M:%S ", 
123f0 6c 6f 63 61 6c 74 69 6d 65 28 26 63 75 72 72 74  localtime(&currt
12400 69 6d 65 29 29 3b 0a 09 09 09 77 72 69 74 65 28  ime));....write(
12410 6c 6f 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20  log_fd, logmsg, 
12420 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b  strlen(logmsg));
12430 0a 0a 09 09 09 73 6e 70 72 69 6e 74 66 28 6c 6f  .....snprintf(lo
12440 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67  gmsg, sizeof(log
12450 6d 73 67 29 2c 20 22 4d 65 74 68 6f 64 20 5c 22  msg), "Method \"
12460 73 74 61 72 74 5c 22 20 66 61 69 6c 65 64 20 5d  start\" failed ]
12470 5c 6e 22 29 3b 0a 09 09 09 77 72 69 74 65 28 6c  \n");....write(l
12480 6f 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20 73  og_fd, logmsg, s
12490 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a  trlen(logmsg));.
124a0 0a 09 09 09 63 6c 6f 73 65 28 6c 6f 67 5f 66 64  ....close(log_fd
124b0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 54 43  );.....return(TC
124c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09  L_ERROR);...}...
124d0 09 2f 2a 20 34 2e 70 61 72 65 6e 74 2e 67 2e 20  ./* 4.parent.g. 
124e0 52 65 74 75 72 6e 20 50 47 49 44 20 74 6f 20 54  Return PGID to T
124f0 63 6c 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 4f  cl */...Tcl_SetO
12500 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
12510 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
12520 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29  bj((Tcl_WideInt)
12530 20 63 68 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a   child_pgid));..
12540 09 09 63 75 72 72 74 69 6d 65 20 3d 20 74 69 6d  ..currtime = tim
12550 65 28 4e 55 4c 4c 29 3b 0a 09 09 73 74 72 66 74  e(NULL);...strft
12560 69 6d 65 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65  ime(logmsg, size
12570 6f 66 28 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25  of(logmsg), "[ %
12580 62 20 25 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c  b %e %H:%M:%S ",
12590 20 6c 6f 63 61 6c 74 69 6d 65 28 26 63 75 72 72   localtime(&curr
125a0 74 69 6d 65 29 29 3b 0a 09 09 77 72 69 74 65 28  time));...write(
125b0 6c 6f 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c 20  log_fd, logmsg, 
125c0 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b  strlen(logmsg));
125d0 0a 0a 09 09 73 6e 70 72 69 6e 74 66 28 6c 6f 67  ....snprintf(log
125e0 6d 73 67 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 6d  msg, sizeof(logm
125f0 73 67 29 2c 20 22 4d 65 74 68 6f 64 20 5c 22 73  sg), "Method \"s
12600 74 61 72 74 5c 22 20 63 6f 6d 70 6c 65 74 65 64  tart\" completed
12610 2c 20 70 72 6f 63 65 73 73 20 67 72 6f 75 70 20  , process group 
12620 3d 20 25 6c 75 20 5d 5c 6e 22 2c 20 28 75 6e 73  = %lu ]\n", (uns
12630 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 68 69 6c  igned long) chil
12640 64 5f 70 67 69 64 29 3b 0a 09 09 77 72 69 74 65  d_pgid);...write
12650 28 6c 6f 67 5f 66 64 2c 20 6c 6f 67 6d 73 67 2c  (log_fd, logmsg,
12660 20 73 74 72 6c 65 6e 28 6c 6f 67 6d 73 67 29 29   strlen(logmsg))
12670 3b 0a 0a 09 09 63 6c 6f 73 65 28 6c 6f 67 5f 66  ;....close(log_f
12680 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  d);....return(TC
12690 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 34  L_OK);..}.../* 4
126a0 2e 63 68 69 6c 64 2e 61 2e 20 43 6c 6f 73 65 20  .child.a. Close 
126b0 72 65 61 64 20 65 6e 64 20 6f 66 20 70 69 70 65  read end of pipe
126c0 20 2d 2d 20 77 65 20 6f 6e 6c 79 20 77 72 69 74   -- we only writ
126d0 65 20 74 6f 20 69 74 20 2a 2f 0a 09 63 6c 6f 73  e to it */..clos
126e0 65 28 66 64 73 5b 30 5d 29 3b 0a 09 66 64 20 3d  e(fds[0]);..fd =
126f0 20 66 64 73 5b 31 5d 3b 0a 0a 09 2f 2a 20 35 2e   fds[1];.../* 5.
12700 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 65   Create a new se
12710 73 73 69 6f 6e 20 2a 2f 0a 09 73 65 74 73 69 64  ssion */..setsid
12720 5f 72 65 74 20 3d 20 73 65 74 73 69 64 28 29 3b  _ret = setsid();
12730 0a 09 69 66 20 28 73 65 74 73 69 64 5f 72 65 74  ..if (setsid_ret
12740 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 77 72 69 74   == -1) {...writ
12750 65 28 66 64 2c 20 26 63 68 69 6c 64 5f 70 67 69  e(fd, &child_pgi
12760 64 2c 20 73 69 7a 65 6f 66 28 63 68 69 6c 64 5f  d, sizeof(child_
12770 70 67 69 64 29 29 3b 0a 0a 09 09 5f 65 78 69 74  pgid));...._exit
12780 28 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 36 2e 20  (0);..}.../* 6. 
12790 53 65 74 75 70 20 65 6e 76 69 72 6f 6e 6d 65 6e  Setup environmen
127a0 74 20 2a 2f 0a 09 2f 2a 20 36 2e 61 2e 20 53 65  t */../* 6.a. Se
127b0 74 20 75 6d 61 73 6b 20 2a 2f 0a 09 75 6d 61 73  t umask */..umas
127c0 6b 28 75 6d 61 73 6b 5f 76 61 6c 29 3b 0a 0a 09  k(umask_val);...
127d0 2f 2a 20 36 2e 62 2e 20 53 65 74 20 77 6f 72 6b  /* 6.b. Set work
127e0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ing directory */
127f0 0a 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68  ..chdir_ret = ch
12800 64 69 72 28 63 77 64 29 3b 0a 09 69 66 20 28 63  dir(cwd);..if (c
12810 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29 20 7b  hdir_ret != 0) {
12820 0a 09 09 77 72 69 74 65 28 66 64 2c 20 26 63 68  ...write(fd, &ch
12830 69 6c 64 5f 70 67 69 64 2c 20 73 69 7a 65 6f 66  ild_pgid, sizeof
12840 28 63 68 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a  (child_pgid));..
12850 09 09 5f 65 78 69 74 28 30 29 3b 0a 09 7d 0a 0a  .._exit(0);..}..
12860 09 2f 2a 20 36 2e 63 2e 20 4f 70 65 6e 20 6c 6f  ./* 6.c. Open lo
12870 67 20 66 69 6c 65 20 66 6f 72 20 73 74 64 65 72  g file for stder
12880 72 20 61 6e 64 20 73 74 64 6f 75 74 20 2a 2f 0a  r and stdout */.
12890 09 6c 6f 67 5f 66 64 20 3d 20 6f 70 65 6e 28 6c  .log_fd = open(l
128a0 6f 67 66 69 6c 65 2c 20 4f 5f 57 52 4f 4e 4c 59  ogfile, O_WRONLY
128b0 20 7c 20 4f 5f 43 52 45 41 54 20 7c 20 4f 5f 41   | O_CREAT | O_A
128c0 50 50 45 4e 44 2c 20 53 5f 49 52 55 53 52 20 7c  PPEND, S_IRUSR |
128d0 20 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47   S_IWUSR | S_IRG
128e0 52 50 20 7c 20 53 5f 49 52 4f 54 48 29 3b 0a 0a  RP | S_IROTH);..
128f0 09 2f 2a 20 36 2e 64 2e 20 4f 70 65 6e 20 22 2f  ./* 6.d. Open "/
12900 64 65 76 2f 6e 75 6c 6c 22 20 66 6f 72 20 73 74  dev/null" for st
12910 64 69 6e 20 2a 2f 0a 09 6e 75 6c 6c 5f 66 64 20  din */..null_fd 
12920 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c  = open("/dev/nul
12930 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09  l", O_RDONLY);..
12940 69 66 20 28 6e 75 6c 6c 5f 66 64 20 3c 20 30 20  if (null_fd < 0 
12950 7c 7c 20 6c 6f 67 5f 66 64 20 3c 30 29 20 7b 0a  || log_fd <0) {.
12960 09 09 77 72 69 74 65 28 66 64 2c 20 26 63 68 69  ..write(fd, &chi
12970 6c 64 5f 70 67 69 64 2c 20 73 69 7a 65 6f 66 28  ld_pgid, sizeof(
12980 63 68 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09  child_pgid));...
12990 09 5f 65 78 69 74 28 30 29 3b 0a 09 7d 0a 0a 09  ._exit(0);..}...
129a0 2f 2a 20 36 2e 65 2e 20 52 65 64 69 72 65 63 74  /* 6.e. Redirect
129b0 20 73 74 64 69 6e 2c 20 73 74 64 6f 75 74 2c 20   stdin, stdout, 
129c0 61 6e 64 20 73 74 64 65 72 72 20 74 6f 20 6e 75  and stderr to nu
129d0 6c 6c 2c 20 6c 6f 67 73 20 2a 2f 0a 09 64 75 70  ll, logs */..dup
129e0 32 28 6e 75 6c 6c 5f 66 64 2c 20 53 54 44 49 4e  2(null_fd, STDIN
129f0 5f 46 49 4c 45 4e 4f 29 3b 0a 09 64 75 70 32 28  _FILENO);..dup2(
12a00 6c 6f 67 5f 66 64 2c 20 53 54 44 4f 55 54 5f 46  log_fd, STDOUT_F
12a10 49 4c 45 4e 4f 29 3b 0a 09 64 75 70 32 28 6c 6f  ILENO);..dup2(lo
12a20 67 5f 66 64 2c 20 53 54 44 45 52 52 5f 46 49 4c  g_fd, STDERR_FIL
12a30 45 4e 4f 29 3b 0a 0a 09 63 6c 6f 73 65 28 6e 75  ENO);...close(nu
12a40 6c 6c 5f 66 64 29 3b 0a 09 63 6c 6f 73 65 28 6c  ll_fd);..close(l
12a50 6f 67 5f 66 64 29 3b 0a 0a 09 2f 2a 20 36 2e 66  og_fd);.../* 6.f
12a60 2e 20 43 6c 6f 73 65 20 73 74 72 61 79 20 66 69  . Close stray fi
12a70 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 2a  le descriptors *
12a80 2f 0a 09 6d 61 78 5f 66 64 20 3d 20 4d 41 58 28  /..max_fd = MAX(
12a90 4d 41 58 28 4d 41 58 28 31 30 32 34 2c 20 53 54  MAX(MAX(1024, ST
12aa0 44 49 4e 5f 46 49 4c 45 4e 4f 29 2c 20 53 54 44  DIN_FILENO), STD
12ab0 4f 55 54 5f 46 49 4c 45 4e 4f 29 2c 20 53 54 44  OUT_FILENO), STD
12ac0 45 52 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 66 6f  ERR_FILENO);..fo
12ad0 72 20 28 74 6d 70 5f 66 64 20 3d 20 30 3b 20 74  r (tmp_fd = 0; t
12ae0 6d 70 5f 66 64 20 3c 20 6d 61 78 5f 66 64 3b 20  mp_fd < max_fd; 
12af0 74 6d 70 5f 66 64 2b 2b 29 20 7b 0a 09 09 69 66  tmp_fd++) {...if
12b00 20 28 74 6d 70 5f 66 64 20 3d 3d 20 53 54 44 49   (tmp_fd == STDI
12b10 4e 5f 46 49 4c 45 4e 4f 20 7c 7c 20 74 6d 70 5f  N_FILENO || tmp_
12b20 66 64 20 3d 3d 20 53 54 44 4f 55 54 5f 46 49 4c  fd == STDOUT_FIL
12b30 45 4e 4f 20 7c 7c 20 74 6d 70 5f 66 64 20 3d 3d  ENO || tmp_fd ==
12b40 20 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f 29 20   STDERR_FILENO) 
12b50 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  {....continue;..
12b60 09 7d 0a 0a 09 09 69 66 20 28 74 6d 70 5f 66 64  .}....if (tmp_fd
12b70 20 3d 3d 20 66 64 29 20 7b 0a 09 09 09 63 6f 6e   == fd) {....con
12b80 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 63 6c  tinue;...}....cl
12b90 6f 73 65 28 74 6d 70 5f 66 64 29 3b 0a 09 7d 0a  ose(tmp_fd);..}.
12ba0 0a 09 2f 2a 20 36 2e 67 2e 20 53 77 69 74 63 68  ../* 6.g. Switch
12bb0 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
12bc0 75 73 65 72 2f 67 72 6f 75 70 20 2a 2f 0a 09 2f  user/group */../
12bd0 2a 20 36 2e 67 2e 69 2e 20 47 72 6f 75 70 20 2a  * 6.g.i. Group *
12be0 2f 0a 09 73 65 74 67 69 64 28 67 69 64 5f 76 61  /..setgid(gid_va
12bf0 6c 29 3b 0a 0a 09 2f 2a 20 36 2e 67 2e 69 69 2e  l);.../* 6.g.ii.
12c00 20 55 73 65 72 20 2a 2f 0a 09 73 65 74 75 69 64   User */..setuid
12c10 28 75 69 64 5f 76 61 6c 29 3b 0a 0a 09 2f 2a 20  (uid_val);.../* 
12c20 37 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  7. Create a new 
12c30 70 72 6f 63 65 73 73 20 74 6f 20 61 63 74 75 61  process to actua
12c40 6c 6c 79 20 73 70 61 77 6e 20 74 68 65 20 70 72  lly spawn the pr
12c50 6f 63 65 73 73 20 2a 2f 0a 09 63 68 69 6c 64 20  ocess */..child 
12c60 3d 20 66 6f 72 6b 28 29 3b 0a 09 69 66 20 28 63  = fork();..if (c
12c70 68 69 6c 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09  hild == -1) {...
12c80 77 72 69 74 65 28 66 64 2c 20 26 63 68 69 6c 64  write(fd, &child
12c90 5f 70 67 69 64 2c 20 73 69 7a 65 6f 66 28 63 68  _pgid, sizeof(ch
12ca0 69 6c 64 5f 70 67 69 64 29 29 3b 0a 0a 09 09 5f  ild_pgid));...._
12cb0 65 78 69 74 28 30 29 3b 0a 09 7d 0a 0a 09 69 66  exit(0);..}...if
12cc0 20 28 63 68 69 6c 64 20 21 3d 20 30 29 20 7b 0a   (child != 0) {.
12cd0 09 09 2f 2a 20 37 2e 70 61 72 65 6e 74 2e 61 2e  ../* 7.parent.a.
12ce0 20 57 61 69 74 20 66 6f 72 20 63 68 69 6c 64 20   Wait for child 
12cf0 70 72 6f 63 65 73 73 20 74 6f 20 74 65 72 6d 69  process to termi
12d00 6e 61 74 65 20 61 6e 64 20 63 6f 6c 6c 65 63 74  nate and collect
12d10 20 73 74 61 74 75 73 20 2a 2f 0a 09 09 77 61 69   status */...wai
12d20 74 70 69 64 5f 72 65 74 20 3d 20 77 61 69 74 70  tpid_ret = waitp
12d30 69 64 28 63 68 69 6c 64 2c 20 26 73 74 61 74 75  id(child, &statu
12d40 73 2c 20 30 29 3b 0a 09 09 69 66 20 28 77 61 69  s, 0);...if (wai
12d50 74 70 69 64 5f 72 65 74 20 3d 3d 20 2d 31 29 20  tpid_ret == -1) 
12d60 7b 0a 09 09 09 73 74 61 74 75 73 20 3d 20 2d 31  {....status = -1
12d70 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 37 2e 70 61  ;...}..../* 7.pa
12d80 72 65 6e 74 2e 62 2e 20 53 65 74 20 50 47 49 44  rent.b. Set PGID
12d90 20 28 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c   (if successful,
12da0 20 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20 74   -1 otherwise) t
12db0 6f 20 70 61 73 73 20 62 61 63 6b 20 74 6f 20 54  o pass back to T
12dc0 53 4d 46 20 2a 2f 0a 09 09 69 66 20 28 73 74 61  SMF */...if (sta
12dd0 74 75 73 20 3d 3d 20 30 29 20 7b 0a 09 09 09 63  tus == 0) {....c
12de0 68 69 6c 64 5f 70 67 69 64 20 3d 20 67 65 74 70  hild_pgid = getp
12df0 67 69 64 28 67 65 74 70 69 64 28 29 29 3b 0a 09  gid(getpid());..
12e00 09 7d 0a 09 09 77 72 69 74 65 28 66 64 2c 20 26  .}...write(fd, &
12e10 63 68 69 6c 64 5f 70 67 69 64 2c 20 73 69 7a 65  child_pgid, size
12e20 6f 66 28 63 68 69 6c 64 5f 70 67 69 64 29 29 3b  of(child_pgid));
12e30 0a 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a  ....close(fd);..
12e40 09 09 2f 2a 20 37 2e 70 61 72 65 6e 74 2e 63 2e  ../* 7.parent.c.
12e50 20 57 72 69 74 65 20 6c 6f 67 20 6f 66 20 72 65   Write log of re
12e60 73 75 6c 74 20 2a 2f 0a 09 09 2f 2a 20 4e 6f 74  sult */.../* Not
12e70 65 3a 20 57 65 20 61 76 6f 69 64 20 41 4e 53 49  e: We avoid ANSI
12e80 20 49 2f 4f 20 68 65 72 65 20 69 6e 20 63 61 73   I/O here in cas
12e90 65 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  e there is alrea
12ea0 64 79 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e 20  dy something in 
12eb0 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 09  the buffer */...
12ec0 63 75 72 72 74 69 6d 65 20 3d 20 74 69 6d 65 28  currtime = time(
12ed0 4e 55 4c 4c 29 3b 0a 09 09 73 74 72 66 74 69 6d  NULL);...strftim
12ee0 65 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66  e(logmsg, sizeof
12ef0 28 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62 20  (logmsg), "[ %b 
12f00 25 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20 6c  %e %H:%M:%S ", l
12f10 6f 63 61 6c 74 69 6d 65 28 26 63 75 72 72 74 69  ocaltime(&currti
12f20 6d 65 29 29 3b 0a 09 09 77 72 69 74 65 28 53 54  me));...write(ST
12f30 44 45 52 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f 67  DERR_FILENO, log
12f40 6d 73 67 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 6d  msg, strlen(logm
12f50 73 67 29 29 3b 0a 0a 09 09 73 6e 70 72 69 6e 74  sg));....snprint
12f60 66 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66  f(logmsg, sizeof
12f70 28 6c 6f 67 6d 73 67 29 2c 20 22 4d 65 74 68 6f  (logmsg), "Metho
12f80 64 20 5c 22 73 74 61 72 74 5c 22 20 65 78 69 74  d \"start\" exit
12f90 65 64 20 77 69 74 68 20 73 74 61 74 75 73 20 25  ed with status %
12fa0 69 20 5d 5c 6e 22 2c 20 57 45 58 49 54 53 54 41  i ]\n", WEXITSTA
12fb0 54 55 53 28 73 74 61 74 75 73 29 29 3b 0a 09 09  TUS(status));...
12fc0 77 72 69 74 65 28 53 54 44 45 52 52 5f 46 49 4c  write(STDERR_FIL
12fd0 45 4e 4f 2c 20 6c 6f 67 6d 73 67 2c 20 73 74 72  ENO, logmsg, str
12fe0 6c 65 6e 28 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09  len(logmsg));...
12ff0 09 5f 65 78 69 74 28 30 29 3b 0a 09 7d 0a 09 0a  ._exit(0);..}...
13000 09 2f 2a 20 37 2e 63 68 69 6c 64 2e 61 2e 20 43  ./* 7.child.a. C
13010 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20  lose channel to 
13020 70 61 72 65 6e 74 20 2a 2f 0a 09 63 6c 6f 73 65  parent */..close
13030 28 66 64 29 3b 0a 0a 09 2f 2a 20 38 2e 20 4c 6f  (fd);.../* 8. Lo
13040 67 20 61 74 74 65 6d 70 74 20 74 6f 20 72 75 6e  g attempt to run
13050 20 73 74 61 72 74 20 6d 65 74 68 6f 64 20 2a 2f   start method */
13060 0a 09 63 75 72 72 74 69 6d 65 20 3d 20 74 69 6d  ..currtime = tim
13070 65 28 4e 55 4c 4c 29 3b 0a 09 73 74 72 66 74 69  e(NULL);..strfti
13080 6d 65 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f  me(logmsg, sizeo
13090 66 28 6c 6f 67 6d 73 67 29 2c 20 22 5b 20 25 62  f(logmsg), "[ %b
130a0 20 25 65 20 25 48 3a 25 4d 3a 25 53 20 22 2c 20   %e %H:%M:%S ", 
130b0 6c 6f 63 61 6c 74 69 6d 65 28 26 63 75 72 72 74  localtime(&currt
130c0 69 6d 65 29 29 3b 0a 09 77 72 69 74 65 28 53 54  ime));..write(ST
130d0 44 45 52 52 5f 46 49 4c 45 4e 4f 2c 20 6c 6f 67  DERR_FILENO, log
130e0 6d 73 67 2c 20 73 74 72 6c 65 6e 28 6c 6f 67 6d  msg, strlen(logm
130f0 73 67 29 29 3b 0a 0a 09 73 6e 70 72 69 6e 74 66  sg));...snprintf
13100 28 6c 6f 67 6d 73 67 2c 20 73 69 7a 65 6f 66 28  (logmsg, sizeof(
13110 6c 6f 67 6d 73 67 29 2c 20 22 45 78 65 63 75 74  logmsg), "Execut
13120 69 6e 67 20 73 74 61 72 74 20 6d 65 74 68 6f 64  ing start method
13130 20 28 5c 22 25 73 5c 22 29 20 5d 5c 6e 22 2c 20   (\"%s\") ]\n", 
13140 66 69 6c 65 6e 61 6d 65 29 3b 0a 09 77 72 69 74  filename);..writ
13150 65 28 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f 2c  e(STDERR_FILENO,
13160 20 6c 6f 67 6d 73 67 2c 20 73 74 72 6c 65 6e 28   logmsg, strlen(
13170 6c 6f 67 6d 73 67 29 29 3b 0a 0a 09 2f 2a 20 39  logmsg));.../* 9
13180 2e 20 65 78 65 63 76 65 28 29 20 6e 65 77 20 69  . execve() new i
13190 6d 61 67 65 20 2a 2f 0a 09 61 72 67 76 5b 30 5d  mage */..argv[0]
131a0 20 3d 20 66 69 6c 65 6e 61 6d 65 3b 0a 09 61 72   = filename;..ar
131b0 67 76 5b 31 5d 20 3d 20 22 73 74 61 72 74 22 3b  gv[1] = "start";
131c0 0a 09 61 72 67 76 5b 32 5d 20 3d 20 4e 55 4c 4c  ..argv[2] = NULL
131d0 3b 0a 09 65 78 65 63 76 65 5f 72 65 74 20 3d 20  ;..execve_ret = 
131e0 65 78 65 63 76 65 28 66 69 6c 65 6e 61 6d 65 2c  execve(filename,
131f0 20 61 72 67 76 2c 20 65 6e 76 76 29 3b 0a 0a 09   argv, envv);...
13200 2f 2a 20 31 30 2e 20 41 62 6f 72 74 20 69 66 20  /* 10. Abort if 
13210 73 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 67 6f  something has go
13220 6e 65 20 77 72 6f 6e 67 20 2a 2f 0a 09 5f 65 78  ne wrong */.._ex
13230 69 74 28 65 78 65 63 76 65 5f 72 65 74 29 3b 0a  it(execve_ret);.
13240 0a 09 2f 2a 20 48 61 6e 64 6c 65 20 6c 69 6e 74  ../* Handle lint
13250 2d 6e 65 73 73 20 2a 2f 0a 09 72 65 74 75 72 6e  -ness */..return
13260 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 73 72  (TCL_ERROR);..sr
13270 69 5f 6f 62 6a 20 3d 20 73 72 69 5f 6f 62 6a 3b  i_obj = sri_obj;
13280 0a 7d 0a 0a 69 6e 74 20 54 75 61 70 69 5f 49 6e  .}..int Tuapi_In
13290 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
132a0 6e 74 65 72 70 29 20 7b 0a 23 69 66 64 65 66 20  nterp) {.#ifdef 
132b0 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 63  USE_TCL_STUBS..c
132c0 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 49 6e  onst char *tclIn
132d0 69 74 53 74 75 62 73 5f 72 65 74 3b 0a 0a 09 2f  itStubs_ret;.../
132e0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 74 75  * Initialize Stu
132f0 62 73 20 2a 2f 0a 09 74 63 6c 49 6e 69 74 53 74  bs */..tclInitSt
13300 75 62 73 5f 72 65 74 20 3d 20 54 63 6c 5f 49 6e  ubs_ret = Tcl_In
13310 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
13320 22 38 2e 34 22 2c 20 30 29 3b 0a 09 69 66 20 28  "8.4", 0);..if (
13330 21 74 63 6c 49 6e 69 74 53 74 75 62 73 5f 72 65  !tclInitStubs_re
13340 74 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 54 43  t) {...return(TC
13350 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 23 65 6e  L_ERROR);..}.#en
13360 64 69 66 0a 0a 09 2f 2a 20 4b 65 72 6e 65 6c 20  dif.../* Kernel 
13370 6d 61 69 6e 74 65 6e 61 6e 63 65 20 72 65 6c 61  maintenance rela
13380 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a  ted commands */.
13390 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
133a0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
133b0 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a  :tuapi::syscall:
133c0 3a 69 6e 73 6d 6f 64 22 2c 20 74 75 61 70 69 5f  :insmod", tuapi_
133d0 69 6e 73 6d 6f 64 2c 20 4e 55 4c 4c 2c 20 4e 55  insmod, NULL, NU
133e0 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65  LL);..Tcl_Create
133f0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13400 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  p, "::tuapi::sys
13410 63 61 6c 6c 3a 3a 72 6d 6d 6f 64 22 2c 20 74 75  call::rmmod", tu
13420 61 70 69 5f 72 6d 6d 6f 64 2c 20 4e 55 4c 4c 2c  api_rmmod, NULL,
13430 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65   NULL);..Tcl_Cre
13440 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
13450 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a  terp, "::tuapi::
13460 73 79 73 63 61 6c 6c 3a 3a 6c 73 6d 6f 64 22 2c  syscall::lsmod",
13470 20 74 75 61 70 69 5f 6c 73 6d 6f 64 2c 20 4e 55   tuapi_lsmod, NU
13480 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  LL, NULL);..Tcl_
13490 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
134a0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70  (interp, "::tuap
134b0 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 68 6f 73 74  i::syscall::host
134c0 6e 61 6d 65 22 2c 20 74 75 61 70 69 5f 68 6f 73  name", tuapi_hos
134d0 74 6e 61 6d 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  tname, NULL, NUL
134e0 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f  L);..Tcl_CreateO
134f0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13500 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63  , "::tuapi::sysc
13510 61 6c 6c 3a 3a 64 6f 6d 61 69 6e 6e 61 6d 65 22  all::domainname"
13520 2c 20 74 75 61 70 69 5f 64 6f 6d 61 69 6e 6e 61  , tuapi_domainna
13530 6d 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  me, NULL, NULL);
13540 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43  ..Tcl_CreateObjC
13550 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
13560 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c  ::tuapi::syscall
13570 3a 3a 6b 6c 6f 67 63 74 6c 22 2c 20 74 75 61 70  ::klogctl", tuap
13580 69 5f 6b 6c 6f 67 63 74 6c 2c 20 4e 55 4c 4c 2c  i_klogctl, NULL,
13590 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65   NULL);..Tcl_Cre
135a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
135b0 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a  terp, "::tuapi::
135c0 73 79 73 63 61 6c 6c 3a 3a 73 65 74 74 69 6d 65  syscall::settime
135d0 6f 66 64 61 79 22 2c 20 74 75 61 70 69 5f 73 65  ofday", tuapi_se
135e0 74 74 69 6d 65 6f 66 64 61 79 2c 20 4e 55 4c 4c  ttimeofday, NULL
135f0 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 42 6c  , NULL);.../* Bl
13600 6f 63 6b 20 6f 72 20 63 68 61 72 20 64 65 76 69  ock or char devi
13610 63 65 20 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61  ce related comma
13620 6e 64 73 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61  nds */..Tcl_Crea
13630 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
13640 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73  erp, "::tuapi::s
13650 79 73 63 61 6c 6c 3a 3a 6c 6f 73 65 74 75 70 22  yscall::losetup"
13660 2c 20 74 75 61 70 69 5f 6c 6f 73 65 74 75 70 2c  , tuapi_losetup,
13670 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54   NULL, NULL);..T
13680 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
13690 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
136a0 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 65  uapi::syscall::e
136b0 6a 65 63 74 22 2c 20 74 75 61 70 69 5f 65 6a 65  ject", tuapi_eje
136c0 63 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  ct, NULL, NULL);
136d0 0a 0a 09 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d  .../* Filesystem
136e0 20 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64   related command
136f0 73 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65  s */..Tcl_Create
13700 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13710 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73  p, "::tuapi::sys
13720 63 61 6c 6c 3a 3a 6d 6f 75 6e 74 22 2c 20 74 75  call::mount", tu
13730 61 70 69 5f 6d 6f 75 6e 74 2c 20 4e 55 4c 4c 2c  api_mount, NULL,
13740 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65   NULL);..Tcl_Cre
13750 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
13760 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a  terp, "::tuapi::
13770 73 79 73 63 61 6c 6c 3a 3a 75 6d 6f 75 6e 74 22  syscall::umount"
13780 2c 20 74 75 61 70 69 5f 75 6d 6f 75 6e 74 2c 20  , tuapi_umount, 
13790 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  NULL, NULL);..Tc
137a0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
137b0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75  nd(interp, "::tu
137c0 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 77  api::syscall::sw
137d0 61 70 6f 6e 22 2c 20 74 75 61 70 69 5f 73 77 61  apon", tuapi_swa
137e0 70 6f 6e 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  pon, NULL, NULL)
137f0 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  ;..Tcl_CreateObj
13800 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13810 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  "::tuapi::syscal
13820 6c 3a 3a 73 77 61 70 6f 66 66 22 2c 20 74 75 61  l::swapoff", tua
13830 70 69 5f 73 77 61 70 6f 66 66 2c 20 4e 55 4c 4c  pi_swapoff, NULL
13840 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72  , NULL);..Tcl_Cr
13850 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13860 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a  nterp, "::tuapi:
13870 3a 73 79 73 63 61 6c 6c 3a 3a 6d 6b 6e 6f 64 22  :syscall::mknod"
13880 2c 20 74 75 61 70 69 5f 6d 6b 6e 6f 64 2c 20 4e  , tuapi_mknod, N
13890 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a  ULL, NULL);.../*
138a0 20 50 72 6f 63 65 73 73 20 72 65 6c 61 74 65 64   Process related
138b0 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 09 54 63   commands */..Tc
138c0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
138d0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75  nd(interp, "::tu
138e0 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 65  api::syscall::se
138f0 74 75 69 64 22 2c 20 74 75 61 70 69 5f 73 65 74  tuid", tuapi_set
13900 75 69 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  uid, NULL, NULL)
13910 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  ;..Tcl_CreateObj
13920 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13930 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  "::tuapi::syscal
13940 6c 3a 3a 67 65 74 75 69 64 22 2c 20 74 75 61 70  l::getuid", tuap
13950 69 5f 67 65 74 75 69 64 2c 20 4e 55 4c 4c 2c 20  i_getuid, NULL, 
13960 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61  NULL);..Tcl_Crea
13970 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
13980 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73  erp, "::tuapi::s
13990 79 73 63 61 6c 6c 3a 3a 63 68 72 6f 6f 74 22 2c  yscall::chroot",
139a0 20 74 75 61 70 69 5f 63 68 72 6f 6f 74 2c 20 4e   tuapi_chroot, N
139b0 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  ULL, NULL);..Tcl
139c0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
139d0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61  d(interp, "::tua
139e0 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 70 69 76  pi::syscall::piv
139f0 6f 74 5f 72 6f 6f 74 22 2c 20 74 75 61 70 69 5f  ot_root", tuapi_
13a00 70 69 76 6f 74 5f 72 6f 6f 74 2c 20 4e 55 4c 4c  pivot_root, NULL
13a10 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72  , NULL);..Tcl_Cr
13a20 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13a30 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a  nterp, "::tuapi:
13a40 3a 73 79 73 63 61 6c 6c 3a 3a 6b 69 6c 6c 22 2c  :syscall::kill",
13a50 20 74 75 61 70 69 5f 6b 69 6c 6c 2c 20 4e 55 4c   tuapi_kill, NUL
13a60 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43  L, NULL);..Tcl_C
13a70 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13a80 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69  interp, "::tuapi
13a90 3a 3a 73 79 73 63 61 6c 6c 3a 3a 77 61 69 74 70  ::syscall::waitp
13aa0 69 64 22 2c 20 74 75 61 70 69 5f 77 61 69 74 70  id", tuapi_waitp
13ab0 69 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  id, NULL, NULL);
13ac0 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43  ..Tcl_CreateObjC
13ad0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
13ae0 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c  ::tuapi::syscall
13af0 3a 3a 70 73 22 2c 20 74 75 61 70 69 5f 70 73 2c  ::ps", tuapi_ps,
13b00 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54   NULL, NULL);..T
13b10 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
13b20 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
13b30 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 65  uapi::syscall::e
13b40 78 65 63 76 65 22 2c 20 74 75 61 70 69 5f 65 78  xecve", tuapi_ex
13b50 65 63 76 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ecve, NULL, NULL
13b60 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62  );..Tcl_CreateOb
13b70 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13b80 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61   "::tuapi::sysca
13b90 6c 6c 3a 3a 72 6c 69 6d 69 74 22 2c 20 74 75 61  ll::rlimit", tua
13ba0 70 69 5f 72 6c 69 6d 69 74 2c 20 4e 55 4c 4c 2c  pi_rlimit, NULL,
13bb0 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65   NULL);..Tcl_Cre
13bc0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
13bd0 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a  terp, "::tuapi::
13be0 73 79 73 63 61 6c 6c 3a 3a 72 65 62 6f 6f 74 22  syscall::reboot"
13bf0 2c 20 74 75 61 70 69 5f 72 65 62 6f 6f 74 2c 20  , tuapi_reboot, 
13c00 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f  NULL, NULL);.../
13c10 2a 20 4e 65 74 77 6f 72 6b 20 72 65 6c 61 74 65  * Network relate
13c20 64 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 09 54  d commands */..T
13c30 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
13c40 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
13c50 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69  uapi::syscall::i
13c60 66 63 6f 6e 66 69 67 22 2c 20 74 75 61 70 69 5f  fconfig", tuapi_
13c70 69 66 63 6f 6e 66 69 67 2c 20 4e 55 4c 4c 2c 20  ifconfig, NULL, 
13c80 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61  NULL);..Tcl_Crea
13c90 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
13ca0 65 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73  erp, "::tuapi::s
13cb0 79 73 63 61 6c 6c 3a 3a 72 6f 75 74 65 22 2c 20  yscall::route", 
13cc0 74 75 61 70 69 5f 72 6f 75 74 65 2c 20 4e 55 4c  tuapi_route, NUL
13cd0 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43  L, NULL);..Tcl_C
13ce0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13cf0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61 70 69  interp, "::tuapi
13d00 3a 3a 73 79 73 63 61 6c 6c 3a 3a 62 72 63 74 6c  ::syscall::brctl
13d10 22 2c 20 74 75 61 70 69 5f 62 72 63 74 6c 2c 20  ", tuapi_brctl, 
13d20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  NULL, NULL);..Tc
13d30 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
13d40 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75  nd(interp, "::tu
13d50 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 76 63  api::syscall::vc
13d60 6f 6e 66 69 67 22 2c 20 74 75 61 70 69 5f 76 63  onfig", tuapi_vc
13d70 6f 6e 66 69 67 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  onfig, NULL, NUL
13d80 4c 29 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61  L);.../* Termina
13d90 6c 20 72 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e  l related comman
13da0 64 73 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74  ds */..Tcl_Creat
13db0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13dc0 72 70 2c 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79  rp, "::tuapi::sy
13dd0 73 63 61 6c 6c 3a 3a 73 74 74 79 22 2c 20 74 75  scall::stty", tu
13de0 61 70 69 5f 73 74 74 79 2c 20 4e 55 4c 4c 2c 20  api_stty, NULL, 
13df0 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 4e 65 65 64  NULL);.../* Need
13e00 65 64 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  ed commands for 
13e10 62 61 73 69 63 20 73 65 72 76 69 63 65 73 20 54  basic services T
13e20 63 6c 20 6c 61 63 6b 73 20 2a 2f 0a 09 54 63 6c  cl lacks */..Tcl
13e30 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
13e40 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 75 61  d(interp, "::tua
13e50 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 6f 63  pi::syscall::soc
13e60 6b 65 74 5f 75 6e 69 78 22 2c 20 74 75 61 70 69  ket_unix", tuapi
13e70 5f 73 6f 63 6b 65 74 5f 75 6e 69 78 2c 20 4e 55  _socket_unix, NU
13e80 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20  LL, NULL);.../* 
13e90 53 65 72 76 69 63 65 20 28 54 53 4d 46 29 20 72  Service (TSMF) r
13ea0 65 6c 61 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20  elated commands 
13eb0 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62  */..Tcl_CreateOb
13ec0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13ed0 20 22 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61   "::tuapi::sysca
13ee0 6c 6c 3a 3a 74 73 6d 66 5f 73 74 61 72 74 5f 73  ll::tsmf_start_s
13ef0 76 63 22 2c 20 74 75 61 70 69 5f 74 73 6d 66 5f  vc", tuapi_tsmf_
13f00 73 74 61 72 74 5f 73 76 63 2c 20 4e 55 4c 4c 2c  start_svc, NULL,
13f10 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 49 6e 74   NULL);.../* Int
13f20 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 20  ernal functions 
13f30 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62  */..Tcl_CreateOb
13f40 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13f50 20 22 3a 3a 74 75 61 70 69 3a 3a 69 6e 74 65 72   "::tuapi::inter
13f60 6e 61 6c 3a 3a 68 61 73 68 22 2c 20 74 75 61 70  nal::hash", tuap
13f70 69 5f 69 6e 74 65 72 6e 61 6c 70 72 6f 63 5f 73  i_internalproc_s
13f80 69 6d 70 6c 65 68 61 73 68 2c 20 4e 55 4c 4c 2c  implehash, NULL,
13f90 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 44 65 66   NULL);.../* Def
13fa0 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  ine constants */
13fb0 0a 09 2f 2a 2a 20 43 72 65 61 74 65 20 70 61 72  ../** Create par
13fc0 65 6e 74 20 6e 61 6d 65 73 70 61 63 65 20 2a 2a  ent namespace **
13fd0 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 4e 61 6d  /..Tcl_CreateNam
13fe0 65 73 70 61 63 65 28 69 6e 74 65 72 70 2c 20 22  espace(interp, "
13ff0 3a 3a 74 75 61 70 69 3a 3a 63 6f 6e 73 74 22 2c  ::tuapi::const",
14000 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
14010 2f 2a 2a 20 44 65 66 69 6e 65 20 63 6f 6e 73 74  /** Define const
14020 61 6e 74 73 2c 20 66 6f 72 20 72 65 61 6c 20 2a  ants, for real *
14030 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 53 65 74 56 61  */..Tcl_ObjSetVa
14040 72 32 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  r2(interp, Tcl_N
14050 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 3a 3a 74  ewStringObj("::t
14060 75 61 70 69 3a 3a 63 6f 6e 73 74 3a 3a 48 4f 53  uapi::const::HOS
14070 54 5f 4e 41 4d 45 5f 4d 41 58 22 2c 20 2d 31 29  T_NAME_MAX", -1)
14080 2c 20 4e 55 4c 4c 2c 20 54 63 6c 5f 4e 65 77 57  , NULL, Tcl_NewW
14090 69 64 65 49 6e 74 4f 62 6a 28 48 4f 53 54 5f 4e  ideIntObj(HOST_N
140a0 41 4d 45 5f 4d 41 58 29 2c 20 54 43 4c 5f 47 4c  AME_MAX), TCL_GL
140b0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 0a 09 2f 2a  OBAL_ONLY);.../*
140c0 20 43 72 65 61 74 65 20 68 69 67 68 2d 6c 65 76   Create high-lev
140d0 65 6c 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  el user function
140e0 73 20 2a 2f 0a 09 54 63 6c 5f 45 76 61 6c 28 69  s */..Tcl_Eval(i
140f0 6e 74 65 72 70 2c 0a 23 69 6e 63 6c 75 64 65 20  nterp,.#include 
14100 22 74 75 61 70 69 2e 74 63 6c 2e 68 22 20 0a 09  "tuapi.tcl.h" ..
14110 29 3b 0a 0a 09 54 63 6c 5f 50 6b 67 50 72 6f 76  );...Tcl_PkgProv
14120 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 75 61  ide(interp, "tua
14130 70 69 22 2c 20 22 30 2e 37 22 29 3b 0a 0a 09 72  pi", "0.7");...r
14140 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d  eturn(TCL_OK);.}
14150 0a                                               .