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