Tcl Source Code

Hex Artifact Content
Login

Artifact cc7e637d5ced39e4a9833da9b5fad7c4f29b85111fc599b740885aaa8f5ce31b:

Attachment "patch-unix_tclUnixChan_c" to ticket [0ac9d06895] added by stu 2018-06-07 06:27:08.
0000: 24 4f 70 65 6e 42 53 44 24 0a 0a 49 6e 64 65 78  $OpenBSD$..Index
0010: 3a 20 75 6e 69 78 2f 74 63 6c 55 6e 69 78 43 68  : unix/tclUnixCh
0020: 61 6e 2e 63 0a 2d 2d 2d 20 75 6e 69 78 2f 74 63  an.c.--- unix/tc
0030: 6c 55 6e 69 78 43 68 61 6e 2e 63 2e 6f 72 69 67  lUnixChan.c.orig
0040: 0a 2b 2b 2b 20 75 6e 69 78 2f 74 63 6c 55 6e 69  .+++ unix/tclUni
0050: 78 43 68 61 6e 2e 63 0a 40 40 20 2d 31 35 30 34  xChan.c.@@ -1504
0060: 2c 32 39 20 2b 31 35 30 34 2c 33 31 20 40 40 20  ,29 +1504,31 @@ 
0070: 54 63 6c 5f 4d 61 6b 65 46 69 6c 65 43 68 61 6e  Tcl_MakeFileChan
0080: 6e 65 6c 28 0a 20 20 20 20 20 63 68 61 72 20 63  nel(.     char c
0090: 68 61 6e 6e 65 6c 4e 61 6d 65 5b 31 36 20 2b 20  hannelName[16 + 
00a0: 54 43 4c 5f 49 4e 54 45 47 45 52 5f 53 50 41 43  TCL_INTEGER_SPAC
00b0: 45 5d 3b 0a 20 20 20 20 20 69 6e 74 20 66 64 20  E];.     int fd 
00c0: 3d 20 50 54 52 32 49 4e 54 28 68 61 6e 64 6c 65  = PTR2INT(handle
00d0: 29 3b 0a 20 20 20 20 20 63 6f 6e 73 74 20 54 63  );.     const Tc
00e0: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 63  l_ChannelType *c
00f0: 68 61 6e 6e 65 6c 54 79 70 65 50 74 72 3b 0a 2d  hannelTypePtr;.-
0100: 20 20 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61      struct socka
0110: 64 64 72 20 73 6f 63 6b 61 64 64 72 3b 0a 2d 20  ddr sockaddr;.- 
0120: 20 20 20 73 6f 63 6b 6c 65 6e 5f 74 20 73 6f 63     socklen_t soc
0130: 6b 61 64 64 72 4c 65 6e 20 3d 20 73 69 7a 65 6f  kaddrLen = sizeo
0140: 66 28 73 6f 63 6b 61 64 64 72 29 3b 0a 2b 20 20  f(sockaddr);.+  
0150: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
0160: 66 3b 0a 20 0a 20 20 20 20 20 69 66 20 28 6d 6f  f;. .     if (mo
0170: 64 65 20 3d 3d 20 30 29 20 7b 0a 20 09 72 65 74  de == 0) {. .ret
0180: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 7d  urn NULL;.     }
0190: 0a 20 0a 2d 20 20 20 20 73 6f 63 6b 61 64 64 72  . .-    sockaddr
01a0: 2e 73 61 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f  .sa_family = AF_
01b0: 55 4e 53 50 45 43 3b 0a 2d 0a 20 23 69 66 64 65  UNSPEC;.-. #ifde
01c0: 66 20 53 55 50 50 4f 52 54 53 5f 54 54 59 0a 20  f SUPPORTS_TTY. 
01d0: 20 20 20 20 69 66 20 28 69 73 61 74 74 79 28 66      if (isatty(f
01e0: 64 29 29 20 7b 0a 20 09 63 68 61 6e 6e 65 6c 54  d)) {. .channelT
01f0: 79 70 65 50 74 72 20 3d 20 26 74 74 79 43 68 61  ypePtr = &ttyCha
0200: 6e 6e 65 6c 54 79 70 65 3b 0a 20 09 73 70 72 69  nnelType;. .spri
0210: 6e 74 66 28 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ntf(channelName,
0220: 20 22 73 65 72 69 61 6c 25 64 22 2c 20 66 64 29   "serial%d", fd)
0230: 3b 0a 20 20 20 20 20 7d 20 65 6c 73 65 0a 20 23  ;.     } else. #
0240: 65 6e 64 69 66 20 2f 2a 20 53 55 50 50 4f 52 54  endif /* SUPPORT
0250: 53 5f 54 54 59 20 2a 2f 0a 2d 20 20 20 20 69 66  S_TTY */.-    if
0260: 20 28 28 67 65 74 73 6f 63 6b 6e 61 6d 65 28 66   ((getsockname(f
0270: 64 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61  d, (struct socka
0280: 64 64 72 20 2a 29 26 73 6f 63 6b 61 64 64 72 2c  ddr *)&sockaddr,
0290: 20 26 73 6f 63 6b 61 64 64 72 4c 65 6e 29 20 3d   &sockaddrLen) =
02a0: 3d 20 30 29 0a 2d 09 26 26 20 28 73 6f 63 6b 61  = 0).-.&& (socka
02b0: 64 64 72 4c 65 6e 20 3e 20 30 29 0a 2d 09 26 26  ddrLen > 0).-.&&
02c0: 20 28 73 6f 63 6b 61 64 64 72 2e 73 61 5f 66 61   (sockaddr.sa_fa
02d0: 6d 69 6c 79 20 3d 3d 20 41 46 5f 49 4e 45 54 20  mily == AF_INET 
02e0: 7c 7c 20 73 6f 63 6b 61 64 64 72 2e 73 61 5f 66  || sockaddr.sa_f
02f0: 61 6d 69 6c 79 20 3d 3d 20 41 46 5f 49 4e 45 54  amily == AF_INET
0300: 36 29 29 20 7b 0a 2d 09 72 65 74 75 72 6e 20 54  6)) {.-.return T
0310: 63 6c 70 4d 61 6b 65 54 63 70 43 6c 69 65 6e 74  clpMakeTcpClient
0320: 43 68 61 6e 6e 65 6c 4d 6f 64 65 28 49 4e 54 32  ChannelMode(INT2
0330: 50 54 52 28 66 64 29 2c 20 6d 6f 64 65 29 3b 0a  PTR(fd), mode);.
0340: 2d 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2d 09  -    } else {.-.
0350: 63 68 61 6e 6e 65 6c 54 79 70 65 50 74 72 20 3d  channelTypePtr =
0360: 20 26 66 69 6c 65 43 68 61 6e 6e 65 6c 54 79 70   &fileChannelTyp
0370: 65 3b 0a 2d 09 73 70 72 69 6e 74 66 28 63 68 61  e;.-.sprintf(cha
0380: 6e 6e 65 6c 4e 61 6d 65 2c 20 22 66 69 6c 65 25  nnelName, "file%
0390: 64 22 2c 20 66 64 29 3b 0a 2b 20 20 20 20 69 66  d", fd);.+    if
03a0: 20 28 66 73 74 61 74 28 66 64 2c 20 26 62 75 66   (fstat(fd, &buf
03b0: 29 20 3d 3d 20 30 20 26 26 20 53 5f 49 53 53 4f  ) == 0 && S_ISSO
03c0: 43 4b 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 29  CK(buf.st_mode))
03d0: 20 7b 0a 2b 09 73 74 72 75 63 74 20 73 6f 63 6b   {.+.struct sock
03e0: 61 64 64 72 20 73 6f 63 6b 61 64 64 72 3b 0a 2b  addr sockaddr;.+
03f0: 09 73 6f 63 6b 6c 65 6e 5f 74 20 73 6f 63 6b 61  .socklen_t socka
0400: 64 64 72 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  ddrLen = sizeof(
0410: 73 6f 63 6b 61 64 64 72 29 3b 0a 2b 09 73 6f 63  sockaddr);.+.soc
0420: 6b 61 64 64 72 2e 73 61 5f 66 61 6d 69 6c 79 20  kaddr.sa_family 
0430: 3d 20 41 46 5f 55 4e 53 50 45 43 3b 0a 2b 09 69  = AF_UNSPEC;.+.i
0440: 66 20 28 28 67 65 74 73 6f 63 6b 6e 61 6d 65 28  f ((getsockname(
0450: 66 64 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b  fd, (struct sock
0460: 61 64 64 72 20 2a 29 26 73 6f 63 6b 61 64 64 72  addr *)&sockaddr
0470: 2c 20 26 73 6f 63 6b 61 64 64 72 4c 65 6e 29 20  , &sockaddrLen) 
0480: 3d 3d 20 30 29 0a 2b 09 20 20 20 20 26 26 20 28  == 0).+.    && (
0490: 73 6f 63 6b 61 64 64 72 4c 65 6e 20 3e 20 30 29  sockaddrLen > 0)
04a0: 0a 2b 09 20 20 20 20 26 26 20 28 73 6f 63 6b 61  .+.    && (socka
04b0: 64 64 72 2e 73 61 5f 66 61 6d 69 6c 79 20 3d 3d  ddr.sa_family ==
04c0: 20 41 46 5f 49 4e 45 54 20 7c 7c 20 73 6f 63 6b   AF_INET || sock
04d0: 61 64 64 72 2e 73 61 5f 66 61 6d 69 6c 79 20 3d  addr.sa_family =
04e0: 3d 20 41 46 5f 49 4e 45 54 36 29 29 20 7b 0a 2b  = AF_INET6)) {.+
04f0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 70  .    return Tclp
0500: 4d 61 6b 65 54 63 70 43 6c 69 65 6e 74 43 68 61  MakeTcpClientCha
0510: 6e 6e 65 6c 4d 6f 64 65 28 49 4e 54 32 50 54 52  nnelMode(INT2PTR
0520: 28 66 64 29 2c 20 6d 6f 64 65 29 3b 0a 2b 09 7d  (fd), mode);.+.}
0530: 0a 20 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 20 63  .     }.+.+    c
0540: 68 61 6e 6e 65 6c 54 79 70 65 50 74 72 20 3d 20  hannelTypePtr = 
0550: 26 66 69 6c 65 43 68 61 6e 6e 65 6c 54 79 70 65  &fileChannelType
0560: 3b 0a 2b 20 20 20 20 73 70 72 69 6e 74 66 28 63  ;.+    sprintf(c
0570: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 22 66 69 6c  hannelName, "fil
0580: 65 25 64 22 2c 20 66 64 29 3b 0a 20 0a 20 20 20  e%d", fd);. .   
0590: 20 20 66 73 50 74 72 20 3d 20 63 6b 61 6c 6c 6f    fsPtr = ckallo
05a0: 63 28 73 69 7a 65 6f 66 28 46 69 6c 65 53 74 61  c(sizeof(FileSta
05b0: 74 65 29 29 3b 0a 20 20 20 20 20 66 73 50 74 72  te));.     fsPtr
05c0: 2d 3e 66 64 20 3d 20 66 64 3b 0a                 ->fd = fd;.