Socket.st
author Claus Gittinger <cg@exept.de>
Sun, 12 Nov 1995 20:10:36 +0100
changeset 116 7789fb1c9fa2
parent 115 a9d85df931c4
child 117 03cefad7e40b
permissions -rw-r--r--
more UD socket fixes (at least client side seems to work now)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     1
"
4
1f66800df351 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
     3
	      All Rights Reserved
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    12
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    13
NonPositionableExternalStream subclass:#Socket
71
claus
parents: 63
diff changeset
    14
       instanceVariableNames:'domain socketType protocol port serviceName
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    15
			      peerName'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    16
       classVariableNames:''
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    17
       poolDictionaries:''
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    18
       category:'Streams-External'
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    19
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    20
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    21
!Socket class methodsFor:'documentation'!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    22
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    23
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    24
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    25
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    26
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    27
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    28
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    29
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    31
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    32
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    33
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    34
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    35
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    36
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    37
version
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
    38
    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.39 1995-11-12 19:10:36 cg Exp $'
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    39
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    40
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    41
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    42
"
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    43
    This class provides access to (unix-)sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    44
    The message protocol is preliminary, until someone tells me how
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    45
    other smalltalk's socket interfaces look like.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    46
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    47
    Also, currently there is almost no support for other than IP 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    48
    sockets - this will be added in the future.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    49
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    50
    code using ST-80 Sockets i.e. RemoteInvocation), there is some old interface
71
claus
parents: 63
diff changeset
    51
    still provided. 
claus
parents: 63
diff changeset
    52
    This will vanish; use the family:type: or newTCPxxx and newUDPxxx interface,
claus
parents: 63
diff changeset
    53
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
    54
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
    55
claus
parents: 63
diff changeset
    56
    ST/X does not use IPSocketAddress, UDSocketAddress erc; all addressing
claus
parents: 63
diff changeset
    57
    is done by passing appropriate string- or byteArray objects containing
claus
parents: 63
diff changeset
    58
    the addresses. This may change, too.
claus
parents: 63
diff changeset
    59
claus
parents: 63
diff changeset
    60
    TODO: cleanup historic leftovers, implement other than inet domain stuff.
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    61
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    62
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    63
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    64
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    65
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    66
    example (get help info from an nntp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    67
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    68
	|sock host|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    69
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    70
	host := OperatingSystem getEnvironment:'NNTPSERVER'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    71
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    72
	sock := Socket newTCPclientToHost:host port:'nntp'.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    73
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    74
	sock buffered:false.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    75
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    76
	sock nextPutAll:'HELP'; cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    77
	[:exit |
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    78
	    |line|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    79
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    80
	    line := sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    81
	    line = '.' ifTrue:[exit value:nil].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    82
	    Transcript showCr:line.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    83
	] loopWithExit.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    84
	sock close
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    85
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    86
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
    87
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    88
    example (connect to an ftp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    89
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    90
	|sock host|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    91
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    92
	host := OperatingSystem getHostName.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    93
	sock := Socket newTCPclientToHost:host port:'ftp'.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    94
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    95
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    96
	Transcript showCr:sock nextLine.
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    97
	sock nextPutAll:('USER ' , 'anonymous'); cr.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    98
	Transcript showCr:sock nextLine.
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
    99
	sock nextPutAll:('PASS ' , 'fooBar'); cr.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   100
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   101
	sock nextPutAll:'LIST'; cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   102
	Transcript showCr:sock nextLine.
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   103
	sock close.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   104
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   105
	'dont know enough of the ftp protocol to continue here ...'
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   106
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   107
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   108
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   109
    example (connect to an snmp server [UDP]):
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   110
74
claus
parents: 71
diff changeset
   111
	|sock port|
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   112
74
claus
parents: 71
diff changeset
   113
	sock := Socket newUDP.
claus
parents: 71
diff changeset
   114
	port := Socket portOfService:'snmp'.
claus
parents: 71
diff changeset
   115
	sock connectTo:(OperatingSystem getHostName) port:port.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   116
	sock buffered:false.
74
claus
parents: 71
diff changeset
   117
	Transcript showCr:'got it'.
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   118
	sock close.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   119
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   120
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   121
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   122
    example (await connection from a client and read some data):
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   123
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   124
	|connectSock sock|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   125
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   126
	connectSock := Socket newTCPserverAtPort:9998.  
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   127
	connectSock isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   128
	    Transcript showCr:'socket setup failed.'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   129
	] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   130
	    Transcript showCr:'listen ..'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   131
	    (connectSock listenFor:5) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   132
		Transcript showCr:'listen failed.'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   133
	    ] ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   134
		Transcript showCr:'wait'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   135
		connectSock readWait.  
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   136
		Transcript showCr:'accept'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   137
		sock := connectSock accept.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   138
		sock isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   139
		    Transcript showCr:'accept failed.'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   140
		] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   141
		    sock buffered:false.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   142
		    Transcript showCr:'server: got it'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   143
		    'can now do transfer via sock'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   144
		    Transcript showCr:'read'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   145
		    Transcript showCr:('got: ' , sock nextLine).
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   146
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   147
		    Transcript showCr:'close'.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   148
		    sock close
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   149
		].
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   150
		connectSock close.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   151
	    ]
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   152
	]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   153
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   154
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   155
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   156
    example (connect to above server and send some data):
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   157
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   158
	|sock|
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   159
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   160
	sock := Socket newTCPclientToHost:(OperatingSystem getHostName) port:9997.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   161
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   162
	Transcript showCr:'client: got it'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   163
	'can now do transfer via sock'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   164
	Transcript showCr:'sending <hello>'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   165
	sock nextPutLine:'hello'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   166
	sock close
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   167
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   168
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   169
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   170
    example: pingWalk (try to ping hosts on the local network)
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   171
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   172
	|myName myAddress list top hosts walkProcess port|
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   173
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   174
	myName := OperatingSystem getHostName.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   175
	myAddress := Socket ipAddressOfHost:myName.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   176
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   177
	port := Socket portOfService:'echo'.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   178
	port isNil ifTrue:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   179
	    self error:'dont know echo port'.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   180
	    ^ self
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   181
	].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   182
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   183
	top := StandardSystemView new.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   184
	top label:'PING net walk'.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   185
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   186
	list := ScrollableView for:ListView in:top.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   187
	list origin:0.0@0.0 corner:1.0@1.0.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   188
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   189
	top openAndWait.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   190
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   191
	walkProcess := [
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   192
	    |l low hi direction tryHostID dottedName hostName conn addr|
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   193
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   194
	    l := SortedCollection new.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   195
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   196
	    ' only works with type C-net
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   197
	      the code below could simply do 1 to:254 do:[:hostID }
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   198
	      but, to probe likely hosts earlier, the probing is done
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   199
	      ping-pong like around my ip-address (assuming, that other machines
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   200
	      have numbers around my own)'.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   201
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   202
	    low := hi := (myAddress at:4).
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   203
	    direction := 1.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   204
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   205
	    [low > 0 or:[hi < 255]] whileTrue:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   206
		direction > 0 ifTrue:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   207
		    hi := hi + 1.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   208
		    tryHostID := hi.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   209
		    direction := -1.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   210
		] ifFalse:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   211
		    low := low - 1.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   212
		    tryHostID := low.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   213
		    direction := 1.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   214
		].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   215
		(tryHostID between:1 and:254) ifTrue:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   216
		    dottedName := (myAddress at:1) printString
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   217
				  , '.' , (myAddress at:2) printString
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   218
				  , '.' , (myAddress at:3) printString
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   219
				  , '.' , tryHostID printString.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   220
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   221
		    top label:'PING net walk - trying ' , dottedName.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   222
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   223
		    top windowGroup withCursor:Cursor wait do:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   224
			conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   225
			conn notNil ifTrue:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   226
			    addr := Socket ipAddressOfHost:dottedName.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   227
			    hostName := Socket hostWithIpAddress:addr.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   228
			    hostName isNil ifTrue:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   229
				hostName :='?'
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   230
			    ].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   231
			    l add:(dottedName paddedTo:15 with:Character space) 
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   232
				   , ' ' 
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   233
				   , (hostName paddedTo:15 with:Character space)
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   234
				   , ' up & reachable'.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   235
			    list list:l.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   236
			    conn close.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   237
			]
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   238
		    ].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   239
		].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   240
	    ].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   241
	    top label:'PING reachable hosts'.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   242
	] forkAt:(Processor userBackgroundPriority).
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   243
	walkProcess name:'ping net walker'.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   244
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   245
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   246
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   247
!Socket primitiveDefinitions!
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   248
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   249
%{
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   250
/* #define NO_BUFFER */
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   251
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   252
#include <stdio.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   253
#include <errno.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   254
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   255
#ifdef LINUX
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   256
/* kludge to avoid some redefines ... */
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   257
# define _ARPA_NAMESER_H
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   258
# define _NETINET_TCP_H
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   259
#endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   260
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   261
#ifndef transputer
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   262
# include <fcntl.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   263
# include <sys/types.h>
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   264
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   265
# if defined(IRIS) && !defined(IRIX5)
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   266
   /* no socket.h on 4.0.5h ?!?!? */
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   267
#  define AF_UNIX 1
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   268
#  define AF_INET 2
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   269
#  define SOCK_STREAM 1
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   270
#  define SOCK_DGRAM  2
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   271
#  define SOCK_RAW    3
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   272
# else
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   273
#  include <sys/socket.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   274
# endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   275
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   276
# ifdef NEXT3
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   277
#  include <netinet/in_systm.h>
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   278
# endif
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   279
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   280
# include <netdb.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   281
# include <netinet/in.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   282
# if ! (defined(SYSV3) && defined(mc88k))
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   283
#  include <netinet/tcp.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   284
# endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   285
#endif
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   286
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   287
/*
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   288
 * just in case those PF_xxx's are undefined
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   289
 */
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   290
#ifdef AF_UNIX
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   291
# ifndef PF_UNIX
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   292
#  define PF_UNIX AF_UNIX
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   293
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   294
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   295
#ifdef AF_INET
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   296
# ifndef PF_INET
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   297
#  define PF_INET AF_INET
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   298
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   299
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   300
#ifdef AF_DECnet
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   301
# ifndef PF_DECnet
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   302
#  define PF_DECnet AF_DECnet
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   303
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   304
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   305
#ifdef AF_APPLETALK
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   306
# ifndef PF_APPLETALK
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   307
#  define PF_APPLETALK AF_APPLETALK
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   308
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   309
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   310
#ifdef AF_X25
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   311
# ifndef PF_X25
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   312
#  define PF_X25 AF_X25
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   313
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   314
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   315
#ifdef AF_NS
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   316
# ifndef PF_NS
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   317
#  define PF_NS AF_NS
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   318
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   319
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   320
#ifdef AF_SNA
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   321
# ifndef PF_SNA
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   322
#  define PF_SNA AF_SNA
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   323
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   324
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   325
#ifdef AF_RAW
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   326
# ifndef PF_RAW
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   327
#  define PF_RAW AF_RAW
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   328
# endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   329
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   330
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
   331
#ifdef AF_UNIX
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
   332
# include <sys/un.h>
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
   333
#endif
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
   334
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   335
/*
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   336
 * on some systems errno is a macro ... check for it here
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   337
 */
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   338
#ifndef errno
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   339
 extern errno;
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   340
#endif
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   341
71
claus
parents: 63
diff changeset
   342
static int __debugging__ = 0;
claus
parents: 63
diff changeset
   343
claus
parents: 63
diff changeset
   344
#ifdef DEBUG
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   345
# define DBGPRINTF(x)    { if (__debugging__) printf x; }
71
claus
parents: 63
diff changeset
   346
#else
claus
parents: 63
diff changeset
   347
# define DBGPRINTF(x)    /* as nothing */
claus
parents: 63
diff changeset
   348
#endif
claus
parents: 63
diff changeset
   349
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   350
%}
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   351
! !
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   352
75
claus
parents: 74
diff changeset
   353
!Socket class methodsFor:'Signal constants'!
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   354
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   355
brokenConnectionSignal
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   356
    "return the signal used to tell broken connections.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   357
     Since in unix, this is the same as the broken pipe signal,
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   358
     return that one.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   359
     (for other Operatingsystems, this may change ..)"
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   360
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   361
    ^ PipeStream brokenPipeSignal
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   362
! !
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   363
71
claus
parents: 63
diff changeset
   364
!Socket class methodsFor:'debugging'!
claus
parents: 63
diff changeset
   365
claus
parents: 63
diff changeset
   366
debug:aBoolean
claus
parents: 63
diff changeset
   367
    "turn on/off internal debugprints.
claus
parents: 63
diff changeset
   368
     This method is for ST/X debugging only and
claus
parents: 63
diff changeset
   369
     may  be removed in later versions"
claus
parents: 63
diff changeset
   370
claus
parents: 63
diff changeset
   371
%{  /* NOCONTEXT */
claus
parents: 63
diff changeset
   372
claus
parents: 63
diff changeset
   373
    __debugging__ = (aBoolean == true);
claus
parents: 63
diff changeset
   374
%}
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   375
    "
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   376
     Socket debug:true
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   377
     Socket debug:false
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   378
    "
71
claus
parents: 63
diff changeset
   379
! !
claus
parents: 63
diff changeset
   380
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   381
!Socket class methodsFor:'queries'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   382
6
claus
parents: 4
diff changeset
   383
ipAddressOfHost:aHostName
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   384
    "return the IP (internet-) number for a hostname as a byteArray,
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   385
     where the network bytes come first (no matter what the cpus byteOrder is).
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   386
     If the host is unknown, return nil.
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   387
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
   388
claus
parents: 4
diff changeset
   389
    |b1 b2 b3 b4|
claus
parents: 4
diff changeset
   390
claus
parents: 4
diff changeset
   391
%{
claus
parents: 4
diff changeset
   392
    struct sockaddr_in sa ;
claus
parents: 4
diff changeset
   393
    struct hostent *hp ;
claus
parents: 4
diff changeset
   394
    long addr;
claus
parents: 4
diff changeset
   395
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   396
    if (__isString(aHostName)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   397
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   398
	if ((addr = inet_addr((char *) _stringVal(aHostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   399
	    /* is Internet addr in octet notation */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   400
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)); 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   401
	    sa.sin_family = AF_INET;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   402
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   403
	    /* do we know the host's address? */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   404
	    if ((hp = gethostbyname((char *) _stringVal(aHostName))) == NULL) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   405
		DBGPRINTF(("SOCKET: unknown host\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   406
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   407
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   408
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   409
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   410
	}
6
claus
parents: 4
diff changeset
   411
    }
claus
parents: 4
diff changeset
   412
    /* if the addressing family is not AF_INET, return nil */
claus
parents: 4
diff changeset
   413
    if (sa.sin_family != AF_INET) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   414
	RETURN ( nil );
6
claus
parents: 4
diff changeset
   415
    }
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   416
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   417
    sa.sin_addr.s_addr = ntohl(sa.sin_addr.s_addr);    
6
claus
parents: 4
diff changeset
   418
    b1 = _MKSMALLINT((sa.sin_addr.s_addr >> 24) & 0xFF);
claus
parents: 4
diff changeset
   419
    b2 = _MKSMALLINT((sa.sin_addr.s_addr >> 16) & 0xFF);
claus
parents: 4
diff changeset
   420
    b3 = _MKSMALLINT((sa.sin_addr.s_addr >> 8) & 0xFF);
claus
parents: 4
diff changeset
   421
    b4 = _MKSMALLINT((sa.sin_addr.s_addr >> 0) & 0xFF);
claus
parents: 4
diff changeset
   422
%}
claus
parents: 4
diff changeset
   423
.
claus
parents: 4
diff changeset
   424
    ^ ByteArray with:b1 with:b2 with:b3 with:b4
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   425
71
claus
parents: 63
diff changeset
   426
    "
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   427
     Socket ipAddressOfHost:'clam' 
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   428
     Socket ipAddressOfHost:'porty'    
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   429
     Socket ipAddressOfHost:'axept'    
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   430
     Socket ipAddressOfHost:'axept'    
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   431
     Socket ipAddressOfHost:'1.2.3.4'    
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   432
     Socket ipAddressOfHost:'193.15.16.17'    
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   433
     Socket ipAddressOfHost:'josef'     
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   434
     Socket ipAddressOfHost:'styx.com'  
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   435
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost') 
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   436
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1') 
71
claus
parents: 63
diff changeset
   437
    "
6
claus
parents: 4
diff changeset
   438
!
claus
parents: 4
diff changeset
   439
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   440
hostWithIpAddress:anAddress
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   441
    "return the hostname for an IP (internet-) address.
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   442
     The address is supposed to be a byteArray consisting of 4 bytes,
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   443
     the network bytes come first (no matter what the local byteorder is).
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   444
     This is the reverse operation to #ipAddressOfHost:."
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   445
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   446
    |b1 b2 b3 b4|
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   447
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   448
    b1 := anAddress at:1.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   449
    b2 := anAddress at:2.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   450
    b3 := anAddress at:3.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   451
    b4 := anAddress at:4.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   452
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   453
    struct sockaddr_in sa ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   454
    struct hostent *hp ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   455
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   456
    if (__bothSmallInteger(b1, b2) && __bothSmallInteger(b3, b4)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   457
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   458
	sa.sin_addr.s_addr = _intVal(b1) & 0xFF;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   459
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b2) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   460
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b3) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   461
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b4) & 0xFF);
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   462
	sa.sin_addr.s_addr = htonl(sa.sin_addr.s_addr);    
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   463
	sa.sin_family = AF_INET;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   464
	/* do we know the host's address? */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   465
	hp = gethostbyaddr((char *) &sa.sin_addr.s_addr, sizeof(sa.sin_addr.s_addr), AF_INET);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   466
	if (hp == NULL) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   467
	    DBGPRINTF(("SOCKET: unknown address: %d.%d.%d.%d\n", 
71
claus
parents: 63
diff changeset
   468
		       _intVal(b1), _intVal(b2), _intVal(b3), _intVal(b4)));
claus
parents: 63
diff changeset
   469
	} else {
claus
parents: 63
diff changeset
   470
	    sa.sin_family = hp->h_addrtype;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   471
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   472
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   473
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   474
    /* if the addressing family is not AF_INET, return nil */
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   475
    if (sa.sin_family != AF_INET) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   476
	RETURN ( nil );
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   477
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   478
    if (hp != NULL)
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   479
	RETURN (_MKSTRING(hp->h_name COMMA_CON));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   480
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   481
    RETURN (_MKSTRING(inet_ntoa(sa.sin_addr) COMMA_CON));
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   482
%}
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   483
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   484
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   485
     Socket ipAddressOfHost:'clam'
71
claus
parents: 63
diff changeset
   486
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam') 
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   487
     Socket ipAddressOfHost:'porty'
71
claus
parents: 63
diff changeset
   488
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty') 
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   489
     Socket hostWithIpAddress:#[1 2 3 4]  
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   490
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'1.2.3.4')  
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   491
     "
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   492
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   493
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   494
portOfService:aNameOrNumber
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   495
    "returns the port-number for a given service
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   496
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   497
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   498
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   499
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   500
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   501
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   502
     Socket portOfService:'finger'
74
claus
parents: 71
diff changeset
   503
     Socket portOfService:'nntp'  
claus
parents: 71
diff changeset
   504
     Socket portOfService:'echo' 
claus
parents: 71
diff changeset
   505
     Socket portOfService:'snmp' 
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   506
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   507
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   508
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   509
portOfService:aNameOrNumber protocol:aProtocol
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   510
    "returns the port-number for a given service
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   511
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   512
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   513
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   514
%{
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   515
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   516
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   517
    int tryBoth = 0;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   518
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
   519
    if (__isString(aProtocol)) {
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   520
	protocol = __stringVal(aProtocol);
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
   521
    } else {
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   522
	protocol = "tcp";
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   523
	tryBoth = 1;
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
   524
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
   525
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   526
    if (__isSmallInteger(aNameOrNumber)) {
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   527
	servent = getservbyport(htons(_intVal(aNameOrNumber)), protocol);
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   528
	if (servent != NULL) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   529
	    RETURN ( aNameOrNumber );
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   530
	}
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   531
	if (tryBoth) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   532
	    servent = getservbyport(htons(_intVal(aNameOrNumber)), "udp");
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   533
	    if (servent != NULL) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   534
		RETURN ( aNameOrNumber );
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   535
	    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   536
	}
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   537
	RETURN ( aNameOrNumber );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   538
    }
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   539
    if (__isString(aNameOrNumber)) {
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   540
	servent = getservbyname((char *) _stringVal(aNameOrNumber), protocol);
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   541
	if (servent != NULL) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   542
	    RETURN ( _MKSMALLINT(ntohs(servent->s_port)) );
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   543
	}
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   544
	if (tryBoth) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   545
	    servent = getservbyname((char *) _stringVal(aNameOrNumber), "udp");
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   546
	    if (servent != NULL) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   547
		RETURN ( _MKSMALLINT(ntohs(servent->s_port)) );
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   548
	    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   549
	}
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   550
	RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   551
    }
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   552
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   553
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   554
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   555
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   556
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   557
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   558
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   559
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   560
protocolOfService:aNameOrNumber
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   561
    "returns the protocol (as string) for a given service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   562
     or nil if no such service exists."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   563
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   564
    struct servent *servent = NULL;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   565
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   566
    if (__isSmallInteger(aNameOrNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   567
	servent = getservbyport(htons(_intVal(aNameOrNumber)), "tcp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   568
	if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   569
	    servent = getservbyport(htons(_intVal(aNameOrNumber)), "udp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   570
	    if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   571
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   572
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   573
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   574
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   575
	if (__isString(aNameOrNumber)) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   576
	    servent = getservbyname((char *) _stringVal(aNameOrNumber), "tcp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   577
	    if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   578
		servent = getservbyname((char *) _stringVal(aNameOrNumber), "udp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   579
		if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   580
		    RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   581
		}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   582
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   583
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   584
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   585
    if (servent) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   586
	RETURN ( _MKSTRING(servent->s_proto COMMA_CON) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   587
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   588
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   589
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   590
    "
74
claus
parents: 71
diff changeset
   591
     Socket protocolOfService:'finger' 
claus
parents: 71
diff changeset
   592
     Socket protocolOfService:'nntp'  
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   593
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   594
     Socket protocolOfService:79
74
claus
parents: 71
diff changeset
   595
     Socket protocolOfService:'snmp' 
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   596
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   597
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   598
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   599
domainOfProtocol:aProtocol
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   600
    "given a protocols name (i.e. tcp, udp etc) return the domain.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   601
     This method needs more ... - or is there a way to get this from the system ?"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   602
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   603
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   604
     tcp/ip stuff
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   605
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   606
    (aProtocol = 'tcp') ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   607
    (aProtocol = 'udp') ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   608
    (aProtocol = 'ip')  ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   609
    "
71
claus
parents: 63
diff changeset
   610
     unix domain
claus
parents: 63
diff changeset
   611
    "
claus
parents: 63
diff changeset
   612
    (aProtocol = 'ud')  ifTrue:[^ #unix].
claus
parents: 63
diff changeset
   613
claus
parents: 63
diff changeset
   614
    "
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   615
     add x25 stuff (if any) here ...
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   616
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   617
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   618
     add appletalk stuff (if any) here ...
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   619
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   620
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   621
     add other stuff (if any) here ...
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   622
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   623
    ^ nil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   624
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   625
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   626
     Socket domainOfProtocol:'tcp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   627
     Socket domainOfProtocol:'ucp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   628
     Socket domainOfProtocol:(Socket protocolOfService:'nntp')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   629
     Socket domainOfProtocol:(Socket protocolOfService:'echo')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   630
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   631
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   632
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   633
typeOfProtocol:aProtocol
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   634
    "given a protocols name (i.e. tcp, udp etc) return the connection type.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   635
     This method needs more ... - or is there a way to get this from the system ?"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   636
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   637
    (aProtocol = 'tcp') ifTrue:[^ #stream].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   638
    (aProtocol = 'udp') ifTrue:[^ #datagram].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   639
    (aProtocol = 'ip')  ifTrue:[^ #raw].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   640
    "
71
claus
parents: 63
diff changeset
   641
     unix domain
claus
parents: 63
diff changeset
   642
    "
claus
parents: 63
diff changeset
   643
    (aProtocol = 'ud')  ifTrue:[^ #stream].
claus
parents: 63
diff changeset
   644
    "
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   645
     add x25 stuff (if any) here ...
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   646
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   647
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   648
     add appletalk stuff (if any) here ...
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   649
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   650
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
   651
     add other stuff (if any) here ...
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   652
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   653
    ^ nil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   654
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   655
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   656
     Socket typeOfProtocol:'tcp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   657
     Socket typeOfProtocol:'ucp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   658
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   659
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   660
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   661
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   662
71
claus
parents: 63
diff changeset
   663
!Socket class methodsFor:'easy tcp/ip instance creation'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   664
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   665
connectTo:service on:host
71
claus
parents: 63
diff changeset
   666
    "standard & easy client setup: 
claus
parents: 63
diff changeset
   667
	create new client tcp socket, bind and connect; 
claus
parents: 63
diff changeset
   668
	return the socket.
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   669
     The system may block (interruptable), until the connection is 
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   670
     established."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   671
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   672
    ^ (self new) for:host port:(self portOfService:service).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   673
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   674
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   675
     Socket connectTo:9995 on:'clam'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   676
     Socket connectTo:'finger' on:'clam'
71
claus
parents: 63
diff changeset
   677
     Socket connectTo:'ftp' on:'clam'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   678
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   679
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   680
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   681
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   682
provide:service
71
claus
parents: 63
diff changeset
   683
    "standard & easy server setup: 
claus
parents: 63
diff changeset
   684
	create a new TCP server socket providing a service."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   685
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   686
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   687
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   688
    newSock := (self new) for:nil port:(self portOfService:service).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   689
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   690
	newSock listenFor:5.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   691
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   692
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   693
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   694
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   695
     Socket provide:9995
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   696
     (Socket provide:9996) accept
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   697
     Socket provide:'nntp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   698
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   699
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   700
71
claus
parents: 63
diff changeset
   701
!Socket class methodsFor:'ST80 queries'!
claus
parents: 63
diff changeset
   702
claus
parents: 63
diff changeset
   703
sockStream
claus
parents: 63
diff changeset
   704
    "return the type code for stream sockets"
claus
parents: 63
diff changeset
   705
claus
parents: 63
diff changeset
   706
    ^ #stream
claus
parents: 63
diff changeset
   707
! !
claus
parents: 63
diff changeset
   708
claus
parents: 63
diff changeset
   709
!Socket class methodsFor:'ST80 instance creation'!
claus
parents: 63
diff changeset
   710
claus
parents: 63
diff changeset
   711
family:domainSymbol type:typeSymbol
claus
parents: 63
diff changeset
   712
    "create a socket for domain and type - ST80 simply uses a different name.
claus
parents: 63
diff changeset
   713
     Domain must be one of the symbols: #inet, #unix, #ns, #appletalk or #ns;
claus
parents: 63
diff changeset
   714
     Type must be #stream, #datagram or #raw
claus
parents: 63
diff changeset
   715
claus
parents: 63
diff changeset
   716
     XXX: currently only the #inet domain is supported"
claus
parents: 63
diff changeset
   717
claus
parents: 63
diff changeset
   718
    ^ self domain:domainSymbol type:typeSymbol
claus
parents: 63
diff changeset
   719
claus
parents: 63
diff changeset
   720
    "
claus
parents: 63
diff changeset
   721
     Socket family:#inet type:#stream
claus
parents: 63
diff changeset
   722
     Socket family:#inet type:#datagram
claus
parents: 63
diff changeset
   723
     Socket family:#unix type:#stream
claus
parents: 63
diff changeset
   724
    "
claus
parents: 63
diff changeset
   725
! !
claus
parents: 63
diff changeset
   726
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   727
!Socket class methodsFor:'general instance creation'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   728
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   729
domain:domainSymbol type:type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   730
    "create a socket for domain and type -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   731
     neither any connect nor binding is done.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   732
     Domain must be one of the symbols: #inet, #unix, #ns, #appletalk or #ns;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   733
     Type must be #stream, #datagram or #raw
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   734
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   735
     XXX: currently only the #inet domain is supported"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   736
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   737
    ^ self new domain:domainSymbol type:type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   738
71
claus
parents: 63
diff changeset
   739
    "
claus
parents: 63
diff changeset
   740
     Socket domain:#inet type:#stream
claus
parents: 63
diff changeset
   741
     Socket domain:#inet type:#datagram
claus
parents: 63
diff changeset
   742
     Socket domain:#unix type:#stream
claus
parents: 63
diff changeset
   743
     Socket domain:#appletalk type:#stream
claus
parents: 63
diff changeset
   744
     Socket domain:#DECnet type:#stream
claus
parents: 63
diff changeset
   745
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   746
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   747
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   748
newUDP
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   749
    "create a UDP socket - no binding or other setup is done,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   750
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   751
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   752
    ^ self new domain:#inet type:#datagram
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   753
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   754
    "Socket newUDP"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   755
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   756
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   757
newUDP:aServiceOrNil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   758
    "create a UDP socket for a service -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   759
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   760
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   761
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   762
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   763
    newSock := self newUDP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   764
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   765
	newSock bindTo:(self portOfService:aServiceOrNil) address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   766
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   767
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   768
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   769
    "Socket newUDP:nil"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   770
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   771
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   772
newTCP
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   773
    "create a TCP socket - no binding or other setup is done,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   774
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   775
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   776
    ^ self new domain:#inet type:#stream 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   777
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   778
    "Socket newUDP"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   779
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   780
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   781
newTCP:aServiceOrNil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   782
    "create a TCP socket for a service -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   783
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   784
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   785
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   786
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   787
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   788
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   789
	newSock bindTo:(self portOfService:aServiceOrNil) address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   790
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   791
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   792
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   793
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   794
    "Socket newTCP:'nntp'"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   795
    "Socket newTCP:9995"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   796
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   797
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   798
newTCPclientToHost:hostname port:aService
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   799
    "create a new TCP client socket connecting to a service.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   800
     Return a socket instance if ok, nil on failure.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   801
     Block until a connection is established (but only the current thread;
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   802
     not the whole smalltalk). 
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   803
     See also: #newTCPclientToHost:port:withTimeout:"
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   804
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   805
    ^ self newTCPclientToHost:hostname port:aService withTimeout:nil
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   806
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   807
    "
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   808
      Socket newTCPclientToHost:'localhost' port:'nntp'
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   809
    "
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   810
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   811
    "Created: 31.10.1995 / 18:54:11 / cg"
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   812
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   813
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   814
newTCPclientToHost:hostname port:aService withTimeout:millis
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   815
    "create a new TCP client socket connecting to a service.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   816
     Return a socket instance if ok, nil on failure.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   817
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   818
     and return nil.."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   819
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   820
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   821
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   822
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   823
    newSock notNil ifTrue:[
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   824
	(newSock connectTo:hostname port:(self portOfService:aService) withTimeout:millis) ifFalse:[
96
9a11f0e36b00 close socket if connect fails (avoid running out of fd's)
Claus Gittinger <cg@exept.de>
parents: 93
diff changeset
   825
	    newSock close.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   826
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   827
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   828
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   829
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   830
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   831
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   832
    ^ (self new) for:hostname port:(self portOfService:aPort).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   833
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   834
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   835
      Socket newTCPclientToHost:'slsv6bt' port:'nntp'
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   836
      Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:1000
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   837
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   838
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   839
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   840
newTCPserverAtPort:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   841
    "create a new TCP server socket providing service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   842
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   843
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   844
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   845
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   846
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   847
	(newSock bindTo:(self portOfService:aService) address:nil) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   848
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   849
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   850
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   851
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   852
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   853
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   854
    ^ (self new) for:nil port:aPort
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   855
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   856
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   857
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   858
newUDPserverAtPort:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   859
    "create a new UDP server socket providing service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   860
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   861
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   862
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   863
    newSock := self newUDP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   864
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   865
	(newSock bindTo:(self portOfService:aService) address:nil) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   866
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   867
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   868
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   869
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   870
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   871
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   872
    ^ (self new) for:nil udpPort:aPort
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   873
"
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   874
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   875
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   876
newUNIX
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   877
    "create a UNIX domain socket - no binding or other setup is done,
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   878
     neither connect nor connect-wait is done."
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   879
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   880
    ^ self new domain:#unix type:#stream 
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   881
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   882
    "
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   883
     Socket newUNIX
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   884
    "
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   885
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   886
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   887
newUNIXclientTo:pathName 
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   888
    "create a new UNIX client socket connecting to a pathname.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   889
     Return a socket instance if ok, nil on failure.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   890
     Block until a connection is established (but only the current thread;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   891
     not the whole smalltalk). 
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   892
     See also: #newUNIXclientTo:withTimeout:"
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   893
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   894
    ^ self newUNIXclientTo:pathName withTimeout:nil
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   895
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   896
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   897
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   898
newUNIXclientTo:pathName withTimeout:millis
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   899
    "create a new UNIX client socket connecting to a pathname.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   900
     Return a socket instance if ok, nil on failure.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   901
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   902
     and return nil.."
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   903
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   904
    |newSock|
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   905
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   906
    newSock := self newUNIX.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   907
    newSock notNil ifTrue:[
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   908
	(newSock connectTo:pathName port:nil withTimeout:millis) ifFalse:[
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   909
	    newSock close.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   910
	    ^ nil
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   911
	]
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   912
    ].
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   913
    ^ newSock
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   914
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   915
    "
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   916
     |s|
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   917
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   918
     s := Socket newUNIXclientTo:'/tmp/foo'
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   919
    "
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   920
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   921
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   922
newUNIXserverAt:pathName
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   923
    "create a new UNIX server socket providing service at a pathname."
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   924
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   925
    |newSock|
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   926
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   927
    newSock := self newUNIX.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   928
    newSock notNil ifTrue:[
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   929
	(newSock bindTo:pathName address:nil) ifFalse:[
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   930
	    ^ nil
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   931
	]
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   932
    ].
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   933
    ^ newSock
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   934
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   935
    "
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   936
     |s s2|
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   937
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   938
     s := Socket newUNIXserverAt:'/tmp/foo'.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   939
     s listenFor:5.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   940
     s2 := s accept.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
   941
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   942
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   943
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   944
!Socket methodsFor:'socket setup'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   945
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   946
domain:domainArg type:typeArg
71
claus
parents: 63
diff changeset
   947
    "set up socket with domain and type.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   948
     This is a low level entry; no binding, listening or connect
71
claus
parents: 63
diff changeset
   949
     is done. Both arguments must be symbols from one of
claus
parents: 63
diff changeset
   950
     #inet,#unix, #appletalk, #x25 .. and #stream, #datagram, #raw resp."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   951
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   952
    ^ self domain:domainArg type:typeArg protocol:0
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   953
!
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   954
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   955
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   956
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   957
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   958
     is done. Both arguments must be symbols from one of
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   959
     #inet,#unix, #appletalk, #x25 .. and #stream, #datagram, #raw resp."
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   960
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   961
    |errorNr|
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   962
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   963
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   964
	^ self error:'already created'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   965
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   966
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   967
    FILE *fp;
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   968
    int dom, typ, pf, proto = 0, sock;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   969
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   970
    if (! __isSymbol(domainArg)) { 
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   971
	DBGPRINTF(("SOCKET: bad domain\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   972
	RETURN ( nil );
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   973
    }
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   974
    if (! __isSymbol(typeArg)) { 
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   975
	DBGPRINTF(("SOCKET: bad type\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   976
	RETURN ( nil );
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   977
    }
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   978
    if (protocolNumber != nil) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   979
	if (!__isSmallInteger(protocolNumber)) {
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   980
	    DBGPRINTF(("SOCKET: bad protocol\n"));
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   981
	    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   982
	}
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   983
	proto = __intVal(protocolNumber);
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   984
    }
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
   985
        
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   986
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   987
    /*
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   988
     * get address and protocol-family
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   989
     */
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   990
#ifdef AF_UNIX
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   991
    if (domainArg == @symbol(unix)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   992
	dom = AF_UNIX;
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   993
    } else
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   994
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   995
#ifdef AF_INET
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   996
    if (domainArg == @symbol(inet)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   997
	dom = AF_INET;
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   998
    } else
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   999
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1000
#ifdef AF_DECnet
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1001
    if (domainArg == @symbol(DECnet)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1002
	dom = AF_DECnet;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1003
    } else
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1004
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1005
#ifdef AF_APPLETALK
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1006
    if (domainArg == @symbol(appletalk)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1007
	dom = AF_APPLETALK;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1008
    } else
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1009
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1010
#ifdef AF_X25
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1011
    if (domainArg == @symbol(x25)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1012
	dom = AF_X25;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1013
    } else
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1014
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1015
#ifdef AF_NS
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1016
    if (domainArg == @symbol(xns)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1017
	dom = AF_NS;
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1018
    } else
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1019
#endif
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1020
#ifdef AF_SNA
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1021
    if (domainArg == @symbol(sna)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1022
	dom = AF_SNA;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1023
    } else
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1024
#endif
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1025
#ifdef AF_RAW
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1026
    if (domainArg == @symbol(raw)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1027
	dom = AF_RAW;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1028
    } else
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1029
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1030
    {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1031
	DBGPRINTF(("SOCKET: unknown domain <%s>\n", _stringVal(domainArg)));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1032
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1033
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1034
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1035
#ifdef SOCK_STREAM
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1036
    if (typeArg == @symbol(stream)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1037
	typ = SOCK_STREAM;
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1038
    } else
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1039
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1040
#ifdef SOCK_DGRAM
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1041
    if (typeArg == @symbol(datagram)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1042
	typ = SOCK_DGRAM;
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1043
    } else 
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1044
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1045
#ifdef SOCK_RAW
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1046
    if (typeArg == @symbol(raw))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1047
	typ = SOCK_RAW;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1048
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1049
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1050
#ifdef SOCK_SEQPACKET
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1051
    if (typeArg == @symbol(seqPacket))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1052
	typ = SOCK_SEQPACKET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1053
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1054
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1055
    {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1056
	DBGPRINTF(("SOCKET: bad type <%s>\n", _stringVal(typeArg)));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1057
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1058
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1059
81
claus
parents: 79
diff changeset
  1060
    __BEGIN_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
  1061
    do {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1062
	DBGPRINTF(("SOCKET: opening socket domain=%d type=%d proto=%d\n", dom, typ, proto));
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1063
	sock = socket(dom, typ, proto);
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1064
#if defined(EPROTONOSUPPORT) /* for SGI */
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1065
	if ((proto != 0) && (sock < 0) && (errno == EPROTONOSUPPORT)) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1066
	    DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1067
	    proto = 0;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1068
	    sock = socket(dom, typ, 0);
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1069
	}
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1070
#endif
6
claus
parents: 4
diff changeset
  1071
    } while ((sock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1072
    __END_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
  1073
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1074
    if (sock < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1075
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1076
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1077
    } else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1078
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1079
	 * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1080
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1081
	fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1082
	if (! fp) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1083
	    DBGPRINTF(("SOCKET: fdopen call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1084
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
  1085
	    __BEGIN_INTERRUPTABLE__
claus
parents: 79
diff changeset
  1086
	    close(sock);
claus
parents: 79
diff changeset
  1087
	    __END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1088
	} else {
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1089
	    _INST(filePointer) = __MKOBJ(fp);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1090
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1091
    }
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1092
%}.
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1093
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1094
    "all ok?"
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1095
    filePointer notNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1096
	domain := domainArg.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1097
	socketType := typeArg.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1098
    ] ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1099
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1100
    ].
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1101
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1102
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1103
     Socket new domain:#inet type:#stream
71
claus
parents: 63
diff changeset
  1104
     Socket new domain:#unix type:#stream
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1105
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1106
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1107
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1108
for:hostName udpPort:portNr
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1109
    "setup for a UDP socket (i.e. inet domain, datagram type) 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1110
     if hostname is nil, a server port is opened;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1111
     otherwise a client port to the server on host.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1112
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1113
     HISTORIC LEFTOVER:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1114
     This method will vanish, as soon as the low level
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1115
     connect/bind works,"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1116
71
claus
parents: 63
diff changeset
  1117
    self obsoleteMethodWarning.
claus
parents: 63
diff changeset
  1118
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1119
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1120
	^ self error:'already created'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1121
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1122
    (portNr isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1123
	^ self error:'invalid portNr'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1124
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1125
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1126
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1127
    struct hostent *hp ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1128
    int a, sock ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1129
    long addr;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1130
    FILE *fp;
6
claus
parents: 4
diff changeset
  1131
    int ret;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1132
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1133
    if (hostName != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1134
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1135
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1136
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1137
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1138
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1139
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1140
	    sa.sin_family = AF_INET ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1141
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1142
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1143
	     * is hostname - 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1144
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1145
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1146
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1147
		DBGPRINTF(("SOCKET: unknown host\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1148
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1149
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1150
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1151
	    sa.sin_family = hp->h_addrtype ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1152
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1153
    } else
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1154
	sa.sin_family = AF_INET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1155
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1156
    /*
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1157
     * create the socket
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1158
     */
81
claus
parents: 79
diff changeset
  1159
    __BEGIN_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
  1160
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1161
	sock = socket(sa.sin_family, SOCK_DGRAM, 0);
6
claus
parents: 4
diff changeset
  1162
    } while ((sock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1163
    __END_INTERRUPTABLE__
claus
parents: 79
diff changeset
  1164
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1165
    if (sock < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1166
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=0) call failed errno=%d\n", sa.sin_family, SOCK_DGRAM, errno));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1167
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1168
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1169
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1170
	 * ok,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1171
	 * connect/bind 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1172
	 */
81
claus
parents: 79
diff changeset
  1173
	__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1174
	if (hostName == nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1175
	    sa.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1176
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1177
		ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1178
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1179
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1180
	    sa.sin_port = htons((u_short) _intVal(portNr)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1181
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1182
		ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1183
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1184
	}
81
claus
parents: 79
diff changeset
  1185
	__END_INTERRUPTABLE__
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1186
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1187
	if (ret < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1188
	    DBGPRINTF(("SOCKET: bind/connect call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1189
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
  1190
	    __BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1191
	    close(sock) ;
81
claus
parents: 79
diff changeset
  1192
	    __END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1193
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1194
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1195
	     * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1196
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1197
	    fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1198
	    if (! fp) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1199
		DBGPRINTF(("SOCKET: fdopen call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1200
		_INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
  1201
		__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1202
		close(sock);
81
claus
parents: 79
diff changeset
  1203
		__END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1204
	    } else {
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1205
#ifdef NO_BUFFER 
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1206
		setbuf(fp, NULL);
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1207
		_INST(buffered) = false;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1208
#endif
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1209
		_INST(filePointer) = __MKOBJ(fp);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1210
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1211
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1212
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1213
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1214
    filePointer isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1215
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1216
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1217
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1218
    mode := #readwrite.
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1219
    binary := false.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1220
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1221
    domain := #inet.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1222
    socketType := #datagram.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1223
    protocol := portNr.
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1224
    peerName := hostName.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1225
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1226
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1227
     Socket new for:'clam' udpPort:(Socket portOfService:'echo')
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1228
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1229
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1230
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1231
for:hostName port:portNr
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1232
    "setup for a TCP socket (i.e. inet domain, stream type) 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1233
     If hostname is nil, a server port is opened,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1234
     otherwise a client port to the server on host.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1235
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1236
     HISTORIC LEFTOVER:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1237
     This method will vanish, as soon as the low level
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1238
     connect/bind works,"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1239
71
claus
parents: 63
diff changeset
  1240
    self obsoleteMethodWarning.
claus
parents: 63
diff changeset
  1241
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1242
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1243
	^ self error:'already created'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1244
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1245
    (portNr isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1246
	^ self error:'invalid portNr'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1247
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1248
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1249
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1250
    struct hostent *hp ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1251
    int a, sock ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1252
    long addr;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1253
    FILE *fp;
6
claus
parents: 4
diff changeset
  1254
    int ret;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1255
    int on = 1;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1256
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1257
    bzero((char *) &sa, sizeof(sa)) ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1258
    sa.sin_family = AF_INET;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1259
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1260
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1261
    if ((hostName != nil) && __isString(hostName)){
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1262
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1263
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1264
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1265
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1266
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1267
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1268
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1269
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1270
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1271
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1272
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1273
		DBGPRINTF(("SOCKET: unknown host\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1274
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1275
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1276
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1277
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1278
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1279
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1280
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1281
    /*
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1282
     * create the socket
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1283
     */
81
claus
parents: 79
diff changeset
  1284
    __BEGIN_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
  1285
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1286
	sock = socket(sa.sin_family, SOCK_STREAM, 0);
6
claus
parents: 4
diff changeset
  1287
    } while ((sock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1288
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1289
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1290
    if (sock < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1291
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=0) call failed errno=%d\n", sa.sin_family, SOCK_STREAM, errno));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1292
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1293
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1294
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1295
	 * connect/bind 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1296
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1297
	sa.sin_port = htons((u_short) _intVal(portNr)) ;
81
claus
parents: 79
diff changeset
  1298
claus
parents: 79
diff changeset
  1299
	__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1300
	if (hostName != nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1301
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1302
		ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1303
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1304
	} else {
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1305
#ifdef SO_REUSEADDR
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1306
	    /*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1307
	     * should I also do this for DGRAM sockets ?
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1308
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1309
	    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1310
		DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1311
	    }
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1312
#endif /* SO_REUSEADDR */
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1313
	    sa.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1314
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1315
		ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1316
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1317
	}
81
claus
parents: 79
diff changeset
  1318
	__END_INTERRUPTABLE__
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1319
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1320
	if (ret < 0) { 
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1321
	    DBGPRINTF(("SOCKET: bind/connect call failed errno=%d\n", errno));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1322
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
  1323
	    __BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1324
	    close(sock) ;
81
claus
parents: 79
diff changeset
  1325
	    __END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1326
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1327
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1328
	     * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1329
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1330
	    fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1331
	    if (! fp) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1332
		DBGPRINTF(("SOCKET: fdopen failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1333
		_INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
  1334
		__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1335
		close(sock);
81
claus
parents: 79
diff changeset
  1336
		__END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1337
	    } else {
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1338
#ifdef NO_BUFFER 
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1339
		setbuf(fp, NULL);
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1340
		_INST(buffered) = false;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1341
#endif
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1342
		_INST(filePointer) = __MKOBJ(fp);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1343
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1344
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1345
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1346
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1347
    filePointer isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1348
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1349
    ].
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1350
    mode := #readwrite.
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1351
    binary := false.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1352
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1353
    domain := #inet.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1354
    socketType := #stream.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1355
    protocol := portNr.
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1356
    peerName := hostName.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1357
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1358
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1359
     Socket new for:'clam' port:(Socket portOfService:'echo')
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1360
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1361
     Socket new for:nil port:9999
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1362
     Socket new for:(OperatingSystem getHostName) port:9999
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1363
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1364
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1365
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1366
!Socket methodsFor:'low level'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1367
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1368
closeFile
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1369
    "low level close"
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1370
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1371
%{  /* NOCONTEXT */
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1372
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1373
    OBJ t;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1374
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1375
    t = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1376
    if (t != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1377
	FILE *fp;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1378
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1379
	fp = __FILEVal(t);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1380
	fflush(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1381
	shutdown(fileno(fp), 2);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1382
	fclose(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1383
	_INST(filePointer) = nil;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1384
    }
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1385
%}
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1386
!
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1387
71
claus
parents: 63
diff changeset
  1388
bindTo:aSocketAddress 
claus
parents: 63
diff changeset
  1389
    "ST80 compatible bind:
claus
parents: 63
diff changeset
  1390
     the socketAddress object is supposed to respond to
claus
parents: 63
diff changeset
  1391
     portOrName and address requests."
claus
parents: 63
diff changeset
  1392
claus
parents: 63
diff changeset
  1393
    ^ self bindTo:(aSocketAddress portOrName)
claus
parents: 63
diff changeset
  1394
	   address:(aSocketAddress address)
claus
parents: 63
diff changeset
  1395
!
claus
parents: 63
diff changeset
  1396
claus
parents: 63
diff changeset
  1397
bindTo:portNrOrName address:address
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1398
    "low level bind - returns true if ok, false otherwise.
71
claus
parents: 63
diff changeset
  1399
     Currently only non-address binding is supported; 
claus
parents: 63
diff changeset
  1400
     i.e. address must always be nil.
claus
parents: 63
diff changeset
  1401
claus
parents: 63
diff changeset
  1402
     The interpretation of portNrOrName depends on the domain:
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1403
	inet domain uses (4byte) byteArray like internet numbers,
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1404
	unix domain uses pathname strings,
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1405
	others use whatever will come up in the future
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1406
     "
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1407
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1408
    ^ self bindTo:portNrOrName address:address reuseAddress:true
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1409
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1410
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1411
bindTo:portNrOrName address:address reuseAddress:reuse
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1412
    "low level bind - returns true if ok, false otherwise.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1413
     Currently only non-address binding is supported; 
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1414
     i.e. address must always be nil.
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1415
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1416
     The interpretation of portNrOrName depends on the domain:
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1417
	inet domain uses (4byte) byteArray like internet numbers,
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1418
	unix domain uses pathname strings,
82
claus
parents: 81
diff changeset
  1419
	others use whatever will come up in the future
71
claus
parents: 63
diff changeset
  1420
     "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1421
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1422
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1423
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1424
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1425
%{
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1426
    OBJ t = _INST(filePointer);
71
claus
parents: 63
diff changeset
  1427
    OBJ myDomain;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1428
    int sock;
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1429
    union {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1430
	struct sockaddr_in in;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1431
	struct sockaddr_un un;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1432
    } sa;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1433
    int sockaddr_size;
6
claus
parents: 4
diff changeset
  1434
    int ret;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1435
    int on = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1436
    int ok;
82
claus
parents: 81
diff changeset
  1437
    extern OBJ LargeInteger;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1438
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1439
    if (!__isString(_INST(domain)) && !__isSymbol(_INST(domain))) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1440
	DBGPRINTF(("SOCKET: invalid domain arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1441
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1442
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1443
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1444
    ok = 0;
71
claus
parents: 63
diff changeset
  1445
    myDomain = _INST(domain);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1446
#ifdef AF_INET
71
claus
parents: 63
diff changeset
  1447
    if (myDomain == @symbol(inet)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1448
	/*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1449
	 * INET addresses - port must be a smallinteger
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1450
	 */
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1451
	sa.in.sin_family = AF_INET;
71
claus
parents: 63
diff changeset
  1452
	if (! __isSmallInteger(portNrOrName)) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1453
	    DBGPRINTF(("SOCKET: invalid port arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1454
	    RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1455
	}
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1456
	sa.in.sin_port = htons((u_short) _intVal(portNrOrName));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1457
	if (address == nil) {
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1458
	    sa.in.sin_addr.s_addr = htonl(INADDR_ANY);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1459
	} else {
82
claus
parents: 81
diff changeset
  1460
	    if (__isInteger(address)) {
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1461
		sa.in.sin_addr.s_addr = htonl(__longIntVal(address));
82
claus
parents: 81
diff changeset
  1462
	    } else {
claus
parents: 81
diff changeset
  1463
		printf("SOCKET: address bind not yet supported\n");
claus
parents: 81
diff changeset
  1464
		RETURN (false);
claus
parents: 81
diff changeset
  1465
	    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1466
	}
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1467
	sockaddr_size = sizeof(struct sockaddr_in);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1468
	ok = 1;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1469
    }
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1470
#endif
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1471
#ifdef AF_UNIX
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1472
    if (myDomain == @symbol(unix)) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1473
	char *pathName;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1474
	int l;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1475
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1476
	if (! __isString(portNrOrName)) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1477
	    DBGPRINTF(("SOCKET: invalid port (pathname) arg\n"));
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1478
	    RETURN (false);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1479
	}
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1480
	pathName = __stringVal(portNrOrName);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1481
	l = strlen(pathName);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1482
	if ((l + sizeof ( sa.un.sun_family )) > sizeof(struct sockaddr_un)) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1483
	    DBGPRINTF(("SOCKET: pathname too long\n"));
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1484
	    RETURN (false);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1485
	}
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1486
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1487
	strcpy(sa.un.sun_path, pathName);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1488
	sa.un.sun_family = AF_UNIX;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1489
	sockaddr_size = l + sizeof ( sa.un.sun_family );
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1490
	ok = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1491
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1492
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1493
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1494
     * XXXX add addressing stuff for other domains here ...
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1495
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1496
#ifdef AF_X25
71
claus
parents: 63
diff changeset
  1497
    if (myDomain == @symbol(x25)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1498
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1499
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1500
#ifdef AF_NS
71
claus
parents: 63
diff changeset
  1501
    if (myDomain == @symbol(ns)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1502
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1503
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1504
#ifdef AF_APPLETALK
71
claus
parents: 63
diff changeset
  1505
    if (myDomain == @symbol(appletalk)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1506
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1507
#endif
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1508
#ifdef AF_SNA
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1509
    if (myDomain == @symbol(sna)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1510
    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1511
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1512
#ifdef AF_NS
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1513
    if (myDomain == @symbol(xns)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1514
    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1515
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1516
#ifdef AF_RAW
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1517
    if (myDomain == @symbol(raw)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1518
    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1519
#endif
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1520
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1521
    if (! ok) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1522
	DBGPRINTF(("SOCKET: unsupported domain\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1523
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1524
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1525
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1526
    sock = fileno(__FILEVal(t));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1527
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1528
#ifdef SO_REUSEADDR
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1529
    if (reuse == true) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1530
	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1531
	    DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1532
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1533
    }
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1534
#endif /* SO_REUSEADDR */
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1535
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1536
    do {
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1537
	ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1538
    } while ((ret < 0) && (errno == EINTR));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1539
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1540
    if (ret < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1541
	DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1542
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1543
	RETURN (false);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1544
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1545
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1546
71
claus
parents: 63
diff changeset
  1547
    port := portNrOrName.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1548
    ^ true
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1549
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1550
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1551
     (Socket domain:#inet type:#stream)
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1552
	 bindTo:9999
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1553
	 address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1554
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1555
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1556
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1557
connectTo:hostOrPathName port:portNrOrName withTimeout:millis
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1558
    "connect to port, portNrOrName on host, hostName.
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1559
     Or path (UNIX socket), where portNrOrName is ignored.
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1560
     Return true if ok, false otherwise.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1561
     Hostname must be a string, portNrOrName an integer port number (in inet domain).
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1562
     If a non-nil timeout is given, stop trying after that time and return false as well."
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1563
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1564
    |stopSignal stopMe connection|
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1565
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1566
    millis isNil ifTrue:[
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1567
	^ self connectTo:hostOrPathName port:portNrOrName
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1568
    ].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1569
    stopSignal := Signal new.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1570
    stopMe := [stopSignal raise].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1571
    stopSignal handle:[:ex |
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1572
"/        'timeout on connect' infoPrintNL.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1573
	^ false
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1574
    ] do:[
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1575
	Processor addTimedBlock:stopMe afterMilliseconds:millis.
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1576
	connection := self connectTo:hostOrPathName port:portNrOrName.
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1577
	Processor removeTimedBlock:stopMe.
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1578
    ].
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1579
    ^ connection
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1580
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1581
    "Created: 31.10.1995 / 18:52:49 / cg"
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1582
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1583
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1584
connectTo:hostOrPathName port:portNrOrName
71
claus
parents: 63
diff changeset
  1585
    "low level connect; connect to port, portNrOrName on host, hostName.
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1586
     For unix-domain sockets, the port argument is ignored and pathName is taken.
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1587
     Other sockets are not yet implemented.
71
claus
parents: 63
diff changeset
  1588
     Return true if ok, false otherwise.
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1589
     Hostname must be a string, portNrOrName an integer port number (in inet domain).
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1590
     The current process will block (but not the whole Smalltalk) until the connection
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1591
     is established. 
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1592
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1593
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1594
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1595
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1596
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1597
%{
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1598
    OBJ t = _INST(filePointer);
71
claus
parents: 63
diff changeset
  1599
    OBJ myDomain;
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1600
    union {
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1601
	struct sockaddr_in in ;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1602
	struct sockaddr_un un;
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1603
    } sa;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1604
    struct hostent *hp ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1605
    int a, sock ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1606
    long addr;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1607
    FILE *fp;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1608
    int ret;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1609
    int on = 1;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1610
    int ok;
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1611
    int sockaddr_size;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1612
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1613
    if (!__isString(_INST(domain)) && !__isSymbol(_INST(domain))) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1614
	DBGPRINTF(("SOCKET: invalid domain arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1615
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1616
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1617
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1618
    ok = 0;
71
claus
parents: 63
diff changeset
  1619
    myDomain = _INST(domain);
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1620
    bzero((char *) &sa, sizeof(sa)) ;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1621
#ifdef AF_INET
71
claus
parents: 63
diff changeset
  1622
    if (myDomain == @symbol(inet)) {
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1623
	char *hostName;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1624
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1625
	if (! __isString(hostOrPathName)) {
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1626
	    DBGPRINTF(("SOCKET: invalid hostname arg\n"));
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1627
	    RETURN (false);
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1628
	}
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1629
	hostName = (char *) _stringVal(hostOrPathName);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1630
71
claus
parents: 63
diff changeset
  1631
	if (! __isSmallInteger(portNrOrName)) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1632
	    DBGPRINTF(("SOCKET: invalid port arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1633
	    RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1634
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1635
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1636
	sa.in.sin_family = AF_INET;
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1637
	sa.in.sin_port = htons((u_short) _intVal(portNrOrName)) ;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1638
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1639
	if ((addr = inet_addr(hostName)) != -1) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1640
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1641
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1642
	     */
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1643
	    bcopy(&addr, (char *) &sa.in.sin_addr, sizeof(addr)) ; /* set address */
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1644
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1645
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1646
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1647
	     */
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1648
	    if ((hp = gethostbyname(hostName)) == NULL) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1649
		DBGPRINTF(("SOCKET: unknown host:%s\n", hostName));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1650
		RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1651
	    }
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1652
	    bcopy(hp->h_addr, (char *) &sa.in.sin_addr, hp->h_length) ;
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1653
	    sa.in.sin_family = hp->h_addrtype;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1654
	}
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1655
	sockaddr_size = sizeof(struct sockaddr_in);
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1656
	ok = 1;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1657
    }
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1658
#endif
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1659
#ifdef AF_UNIX
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1660
    if (myDomain == @symbol(unix)) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1661
	char *pathName;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1662
	int l;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1663
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1664
	if (! __isString(hostOrPathName)) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1665
	    DBGPRINTF(("SOCKET: invalid port (pathname) arg\n"));
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1666
	    RETURN (false);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1667
	}
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1668
	pathName = (char *) __stringVal(hostOrPathName);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1669
	l = strlen(pathName);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1670
	if ((l + sizeof ( sa.un.sun_family )) > sizeof(struct sockaddr_un)) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1671
	    DBGPRINTF(("SOCKET: pathname too long\n"));
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1672
	    RETURN (false);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1673
	}
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1674
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1675
	strcpy(sa.un.sun_path, pathName);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1676
	sa.un.sun_family = AF_UNIX;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1677
	sockaddr_size = l + sizeof ( sa.un.sun_family );
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1678
	ok = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1679
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1680
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1681
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1682
     * XXXX add addressing stuff for other domains here ...
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1683
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1684
#ifdef AF_X25
71
claus
parents: 63
diff changeset
  1685
    if (myDomain == @symbol(x25)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1686
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1687
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1688
#ifdef AF_NS
71
claus
parents: 63
diff changeset
  1689
    if (myDomain == @symbol(ns)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1690
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1691
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1692
#ifdef AF_APPLETALK
71
claus
parents: 63
diff changeset
  1693
    if (myDomain == @symbol(appletalk)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1694
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1695
#endif
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1696
#ifdef AF_NS 
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1697
    if (myDomain == @symbol(xns)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1698
    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1699
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1700
#ifdef AF_SNA
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1701
    if (myDomain == @symbol(sna)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1702
    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1703
#endif
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1704
#ifdef AF_RAW 
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1705
    if (myDomain == @symbol(raw)) {
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1706
    }
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1707
#endif
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1708
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1709
    if (! ok) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1710
	DBGPRINTF(("SOCKET: unsupported domain\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1711
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1712
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1713
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1714
    sock = fileno(__FILEVal(t));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1715
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1716
    /* 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1717
     * connect 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1718
     */
81
claus
parents: 79
diff changeset
  1719
    __BEGIN_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1720
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1721
    do {
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1722
	ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1723
    } while ((ret < 0) 
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1724
	     && ((errno == EINTR)
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1725
#ifdef EAGAIN
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1726
		 || (errno == EAGAIN)
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1727
#endif
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1728
#ifdef EINPROGRESS
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1729
		 || (errno == EINPROGRESS)
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1730
#endif
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1731
		));
81
claus
parents: 79
diff changeset
  1732
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1733
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1734
    if (ret < 0) { 
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1735
	DBGPRINTF(("SOCKET: connect failed errno=%d\n", errno));
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1736
	{
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1737
	    char *cp = (char *)(&sa);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1738
	    int i;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1739
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1740
	    printf("address data:\n");
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1741
	    for (i=0; i<sockaddr_size; i++) {
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1742
		printf(" %02x\n", *cp++);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1743
	    }
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1744
	}
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1745
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1746
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1747
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1748
%}.
71
claus
parents: 63
diff changeset
  1749
    port := portNrOrName.
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1750
    peerName := hostOrPathName.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1751
    ^ true
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1752
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1753
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1754
listenWithBacklog:aNumber
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1755
    "start listening; return true if ok, false on error"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1756
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1757
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1758
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1759
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1760
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1761
    OBJ fp = _INST(filePointer);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1762
    int sock;
6
claus
parents: 4
diff changeset
  1763
    int ret;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1764
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1765
    if (! __isSmallInteger(aNumber)) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1766
	DBGPRINTF(("SOCKET: invalid arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1767
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1768
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1769
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1770
    sock = fileno(__FILEVal(fp));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1771
81
claus
parents: 79
diff changeset
  1772
    __BEGIN_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1773
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1774
	ret = listen(sock, _intVal(aNumber));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1775
    } while ((ret < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1776
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1777
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1778
    if (ret < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1779
	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1780
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1781
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1782
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1783
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1784
    ^ true
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1785
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1786
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1787
listenFor:aNumber
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1788
    "same as listenWithBacklog: - for ST-80 compatibility"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1789
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1790
    ^ self listenWithBacklog:aNumber
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1791
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1792
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1793
acceptOn:aSocket
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1794
    "accept a connection on a server port (created with:'Socket>>onIPPort:')
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1795
     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1796
     Return the true if ok; false if not.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1797
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1798
     NOTICE: this method will block, if no connection is already pending.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1799
	     use readWait or Socket>>accept."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1800
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1801
    |serverSocketFd|
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1802
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1803
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1804
	^ self error:'already connected'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1805
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1806
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1807
    domain := aSocket domain.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1808
    socketType := aSocket type.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1809
    serverSocketFd := aSocket fileDescriptor.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1810
    serverSocketFd isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1811
	^ self error:'invalid server socket'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1812
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1813
    (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1814
	^ self error:'invalid server socket'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1815
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1816
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1817
    FILE *fp;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1818
    int flags;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1819
    int sock, newSock;
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1820
    union {
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1821
	struct sockaddr_in in ;
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1822
	struct sockaddr_un un ;
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1823
    } sa;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1824
    int alen;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1825
    struct hostent *he ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1826
    char dotted[20] ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1827
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1828
    sock = _intVal(serverSocketFd);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1829
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1830
#if defined(O_NDELAY) && defined(SET_NDELAY)
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1831
    flags = ioctl(sock, F_GETFL, 0);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1832
    ioctl(sock, F_SETFL, flags | O_NDELAY);
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1833
#endif
81
claus
parents: 79
diff changeset
  1834
    __BEGIN_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1835
    do {
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1836
        alen = sizeof(sa) ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1837
	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1838
    } while ((newSock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1839
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1840
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1841
#if defined(O_NDELAY) && defined(SET_NDELAY)
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1842
    ioctl(sock, F_SETFL, flags);
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1843
#endif
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1844
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1845
    if (newSock < 0) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1846
	DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1847
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1848
	RETURN (false);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1849
    }
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1850
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1851
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1852
     * extract the partners address
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1853
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1854
#ifdef AF_INET
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1855
    if (_INST(domain) == @symbol(inet)) {
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1856
	he = gethostbyaddr((char *) &sa.in.sin_addr.s_addr, alen, AF_INET) ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1857
	if (! he) {
84
claus
parents: 83
diff changeset
  1858
	    unsigned long norder;
83
claus
parents: 82
diff changeset
  1859
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1860
	    norder = htonl(sa.in.sin_addr.s_addr) ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1861
	    sprintf(dotted, "%d.%d.%d.%d",
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1862
		    (norder >> 24) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1863
		    (norder >> 16) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1864
		    (norder >> 8) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1865
		    norder & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1866
	}
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1867
	DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1868
	_INST(peerName) = _MKSTRING((he ? he->h_name : dotted) COMMA_CON);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1869
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1870
#endif
115
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1871
#ifdef AF_UNIX
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1872
    if (_INST(domain) == @symbol(unix)) {
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1873
	DBGPRINTF(("SOCKET: accepted connection on unix socket\n")) ;
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1874
	/* nothing to be done here */
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1875
    }
a9d85df931c4 added Unix domain support
Claus Gittinger <cg@exept.de>
parents: 112
diff changeset
  1876
#endif
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1877
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1878
    /* 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1879
     * make it a FILE * 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1880
     */
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1881
    fp = fdopen(newSock, "r+");
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1882
    if (! fp) {
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1883
	DBGPRINTF(("SOCKET: fdopen call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1884
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1885
	close(newSock);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1886
	RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1887
    } else {
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1888
#ifdef NO_BUFFER 
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1889
	setbuf(fp, NULL);
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1890
	_INST(buffered) = false;
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1891
#endif
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  1892
	_INST(filePointer) = __MKOBJ(fp);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1893
    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1894
%}.
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1895
    mode := #readwrite.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1896
    binary := false.
71
claus
parents: 63
diff changeset
  1897
    port := aSocket port.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1898
    ^ true
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1899
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1900
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1901
accept
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1902
    "create a new TCP socket from accepting on the receiver.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1903
     This method will suspend the current process if no connection is waiting.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1904
     For ST-80 compatibility"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1905
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1906
    |newSock|
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1907
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
  1908
"/    self readWait.  
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1909
    newSock := self class new.
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1910
    (newSock acceptOn:self) ifFalse:[^ nil].
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1911
    ^ newSock
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1912
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1913
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1914
     |sock newSock|
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1915
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1916
     sock := Socket provide:8004.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1917
     sock listenFor:5.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1918
     newSock := sock accept.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1919
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1920
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1921
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1922
!Socket methodsFor:'queries'!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1923
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1924
getPeer
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1925
    "ST-80 compatibility: return an IPSocketAddress instance representing
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1926
     my hostname/port combination.
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1927
     If you are interrested in the hostname, use getPeerName directly."
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1928
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1929
    domain == #unix ifTrue:[
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1930
	^ UDSocketAddress name:peerName
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1931
    ].
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1932
    ^ IPSocketAddress hostAddress:(self class ipAddressOfHost:peerName) port:port
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1933
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1934
    "Created: 2.11.1995 / 11:22:39 / cg"
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1935
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1936
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1937
getPeerName
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1938
    "return the peer name; thats the hostname (or dotted name) of the
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1939
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1940
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1941
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1942
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1943
81
claus
parents: 79
diff changeset
  1944
getName
claus
parents: 79
diff changeset
  1945
    "return the name; here, we return the ports name"
claus
parents: 79
diff changeset
  1946
claus
parents: 79
diff changeset
  1947
    ^ port printString
claus
parents: 79
diff changeset
  1948
!
claus
parents: 79
diff changeset
  1949
71
claus
parents: 63
diff changeset
  1950
port
claus
parents: 63
diff changeset
  1951
    "return the port number (or name for unix-sockets) to which the socket is bound"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1952
71
claus
parents: 63
diff changeset
  1953
    ^ port
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1954
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1955
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1956
domain
71
claus
parents: 63
diff changeset
  1957
    "return the sockets addressing domain (i.e. #inet, #unix, #x25, #appletalk)"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1958
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1959
    ^ domain
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1960
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1961
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1962
type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1963
    "return the sockets connection type (i.e. #datagram, #stream etc)"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1964
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1965
    ^ socketType
81
claus
parents: 79
diff changeset
  1966
!
claus
parents: 79
diff changeset
  1967
claus
parents: 79
diff changeset
  1968
isActive
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1969
    "return true, if the receiver has a connection"
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  1970
81
claus
parents: 79
diff changeset
  1971
    ^ filePointer notNil
claus
parents: 79
diff changeset
  1972
! !
claus
parents: 79
diff changeset
  1973
claus
parents: 79
diff changeset
  1974
!Socket methodsFor:'ST-80 mimicri'!
claus
parents: 79
diff changeset
  1975
claus
parents: 79
diff changeset
  1976
errorReporter
claus
parents: 79
diff changeset
  1977
    ^ self
claus
parents: 79
diff changeset
  1978
!
claus
parents: 79
diff changeset
  1979
claus
parents: 79
diff changeset
  1980
notReadySignal
claus
parents: 79
diff changeset
  1981
    "for now - this is not yet raised"
claus
parents: 79
diff changeset
  1982
claus
parents: 79
diff changeset
  1983
    ^ Signal new
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1984
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1985
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1986
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1987
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1988
sendTimeout:seconds
71
claus
parents: 63
diff changeset
  1989
    "set the send timeout - for special applications only.
claus
parents: 63
diff changeset
  1990
     Not all operatingSystems offer this functionality
claus
parents: 63
diff changeset
  1991
     (returns false, if unsupported)"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1992
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1993
    |millis|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1994
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1995
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1996
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1997
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1998
    millis := (seconds * 1000) rounded.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1999
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2000
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET) && defined(HZ)
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  2001
    if (__isSmallInteger(millis)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2002
	OBJ fp = _INST(filePointer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2003
	int sock;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2004
	int opt;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2005
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  2006
	sock = fileno(__FILEVal(fp));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2007
	opt = _intVal(millis) / (1000 / HZ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2008
	setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&opt, sizeof(int));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2009
	RETURN(true);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2010
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2011
#endif
71
claus
parents: 63
diff changeset
  2012
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2013
    ^ false
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2014
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2015
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2016
receiveTimeout:seconds
71
claus
parents: 63
diff changeset
  2017
    "set the receive timeout - for special applications only.
claus
parents: 63
diff changeset
  2018
     Not all operatingSystems offer this functionality
claus
parents: 63
diff changeset
  2019
     (returns false, if unsupported)"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2020
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2021
    |millis|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2022
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2023
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2024
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2025
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2026
    millis := (seconds * 1000) rounded.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2027
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2028
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET) && defined(HZ)
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  2029
    if (__isSmallInteger(millis)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2030
	OBJ fp = _INST(filePointer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2031
	int sock;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2032
	int opt;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2033
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  2034
	sock = fileno(__FILEVal(fp));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2035
	opt = _intVal(millis) / (1000 / HZ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2036
	setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&opt, sizeof(int));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2037
	RETURN(true);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2038
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2039
#endif
71
claus
parents: 63
diff changeset
  2040
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2041
    ^ false
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2042
! !
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2043
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2044
!Socket methodsFor:'datagram transmission'!
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2045
81
claus
parents: 79
diff changeset
  2046
receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes
71
claus
parents: 63
diff changeset
  2047
    "receive datagramm data - put address of originating host into
81
claus
parents: 79
diff changeset
  2048
     anAddressBuffer, data into aBuffer. For ST-80 compatibility,
claus
parents: 79
diff changeset
  2049
     the addressBuffer may be a non-ByteArray; then, it must understand
claus
parents: 79
diff changeset
  2050
     the addressBytes-message (i.e. be a SocketAddress instance).
71
claus
parents: 63
diff changeset
  2051
     Return the number of bytes received, or a negative number on error.
claus
parents: 63
diff changeset
  2052
     On error, the unix error code is left in the lastErrorNumber
claus
parents: 63
diff changeset
  2053
     instance variable."
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2054
81
claus
parents: 79
diff changeset
  2055
    |addrBytes addrLen nReceived|
claus
parents: 79
diff changeset
  2056
claus
parents: 79
diff changeset
  2057
    addrBytes := ByteArray new:100.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2058
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2059
    OBJ oClass;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2060
    OBJ fp = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2061
    int nInstVars, nInstBytes, objSize;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2062
    int sock;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2063
    struct sockaddr_in sa ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2064
    int alen;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2065
    int n;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2066
    char *cp;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2067
    int flags = 0;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2068
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2069
    if (fp != nil) {
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  2070
	sock = fileno(__FILEVal(fp));
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2071
71
claus
parents: 63
diff changeset
  2072
	oClass = __Class(aDataBuffer);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2073
	switch (_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2074
	    case BYTEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2075
	    case WORDARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2076
	    case LONGARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2077
	    case FLOATARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2078
	    case DOUBLEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2079
		break;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2080
	    default:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2081
		goto bad;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2082
	}
81
claus
parents: 79
diff changeset
  2083
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2084
	nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2085
	nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2086
	objSize = _Size(aDataBuffer) - nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2087
	cp = (char *)_InstPtr(aDataBuffer) + nInstBytes;
81
claus
parents: 79
diff changeset
  2088
	if (__isSmallInteger(startIndex)) {
claus
parents: 79
diff changeset
  2089
	    cp += __intVal(startIndex);
claus
parents: 79
diff changeset
  2090
	    objSize -= __intVal(startIndex);
claus
parents: 79
diff changeset
  2091
	}
claus
parents: 79
diff changeset
  2092
	if (__isSmallInteger(nBytes)) {
claus
parents: 79
diff changeset
  2093
	    if (__intVal(nBytes) < objSize) {
claus
parents: 79
diff changeset
  2094
		objSize = __intVal(nBytes);
claus
parents: 79
diff changeset
  2095
	    }
claus
parents: 79
diff changeset
  2096
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2097
81
claus
parents: 79
diff changeset
  2098
	__BEGIN_INTERRUPTABLE__
claus
parents: 79
diff changeset
  2099
	do {
claus
parents: 79
diff changeset
  2100
	    if (addrBytes == nil) {
claus
parents: 79
diff changeset
  2101
		n = recvfrom(sock, cp, objSize, flags, (struct sockaddr *) 0, 0);
claus
parents: 79
diff changeset
  2102
	    } else {
claus
parents: 79
diff changeset
  2103
		n = recvfrom(sock, cp, objSize, flags, (struct sockaddr *) &sa, &alen);
claus
parents: 79
diff changeset
  2104
	    }
claus
parents: 79
diff changeset
  2105
	} while ((n < 0) && (errno == EINTR));
claus
parents: 79
diff changeset
  2106
	__END_INTERRUPTABLE__
claus
parents: 79
diff changeset
  2107
claus
parents: 79
diff changeset
  2108
	if (n >= 0) {
claus
parents: 79
diff changeset
  2109
	    if (addrBytes != nil) {
claus
parents: 79
diff changeset
  2110
		oClass = __Class(addrBytes);
claus
parents: 79
diff changeset
  2111
		if ((_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) != BYTEARRAY) 
claus
parents: 79
diff changeset
  2112
		    goto bad;
claus
parents: 79
diff changeset
  2113
		nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
claus
parents: 79
diff changeset
  2114
		nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
claus
parents: 79
diff changeset
  2115
		objSize = _Size(addrBytes) - nInstBytes;
claus
parents: 79
diff changeset
  2116
		cp = (char *)_InstPtr(addrBytes) + nInstBytes;
claus
parents: 79
diff changeset
  2117
		if (objSize < alen) 
claus
parents: 79
diff changeset
  2118
		    goto bad;
claus
parents: 79
diff changeset
  2119
		bcopy((char *)&sa, cp, alen);
claus
parents: 79
diff changeset
  2120
		addrLen = _MKSMALLINT(alen);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2121
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2122
	}
71
claus
parents: 63
diff changeset
  2123
	if (n < 0) {
claus
parents: 63
diff changeset
  2124
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2125
	}
81
claus
parents: 79
diff changeset
  2126
	nReceived = _MKSMALLINT(n);
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2127
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2128
bad: ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2129
%}.
81
claus
parents: 79
diff changeset
  2130
    nReceived notNil ifTrue:[
claus
parents: 79
diff changeset
  2131
	nReceived < 0 ifTrue:[
claus
parents: 79
diff changeset
  2132
	    (OperatingSystem errorTextForNumber:lastErrorNumber) printNL.
claus
parents: 79
diff changeset
  2133
	].
claus
parents: 79
diff changeset
  2134
	addrLen notNil ifTrue:[
claus
parents: 79
diff changeset
  2135
	    anAddressBuffer class isBytes ifTrue:[
claus
parents: 79
diff changeset
  2136
		anAddressBuffer replaceFrom:1 to:addrLen with:addrBytes
claus
parents: 79
diff changeset
  2137
	    ] ifFalse:[
claus
parents: 79
diff changeset
  2138
		"/ can be SocketAddress for ST-80 compatibility
claus
parents: 79
diff changeset
  2139
		anAddressBuffer addressBytes:(addrBytes copyTo:addrLen)
claus
parents: 79
diff changeset
  2140
	    ].
claus
parents: 79
diff changeset
  2141
	].
claus
parents: 79
diff changeset
  2142
	^ nReceived
claus
parents: 79
diff changeset
  2143
    ].
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2144
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2145
     arrive here if you try to receive into an invalid buffer
71
claus
parents: 63
diff changeset
  2146
     (i.e. not ByteArray-like), 
claus
parents: 63
diff changeset
  2147
     or if the addressBuffer is nonNil AND not a ByteArray/String 
claus
parents: 63
diff changeset
  2148
     or if the addressBuffer is nonNil AND too small.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2149
    "
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2150
    self primitiveFailed
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2151
!
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2152
81
claus
parents: 79
diff changeset
  2153
receiveFrom:anAddressBuffer buffer:aDataBuffer
claus
parents: 79
diff changeset
  2154
    "receive datagramm data - put address of originating host into
claus
parents: 79
diff changeset
  2155
     anAddressBuffer, data into aBuffer. 
claus
parents: 79
diff changeset
  2156
     Both must be ByteArray-like. The addressBuffer must
claus
parents: 79
diff changeset
  2157
     provide space for a valid address for my domain (i.e. for inet, a 4-byte byteArray).
claus
parents: 79
diff changeset
  2158
     Return the number of bytes received, or a negative number on error.
claus
parents: 79
diff changeset
  2159
     On error, the unix error code is left in the lastErrorNumber
claus
parents: 79
diff changeset
  2160
     instance variable."
claus
parents: 79
diff changeset
  2161
claus
parents: 79
diff changeset
  2162
    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:1 for:(aDataBuffer size)
claus
parents: 79
diff changeset
  2163
!
claus
parents: 79
diff changeset
  2164
claus
parents: 79
diff changeset
  2165
sendTo:anAddressBuffer buffer:buffer
71
claus
parents: 63
diff changeset
  2166
    "send datagramm data - fetch address of destination host from
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2167
     anAddressBuffer, data from aDataBuffer. 
71
claus
parents: 63
diff changeset
  2168
     Both must be ByteArray-like. The bytes in the addressBuffer must
claus
parents: 63
diff changeset
  2169
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
claus
parents: 63
diff changeset
  2170
     Return the number of bytes transmitted, or a negative number on error.
claus
parents: 63
diff changeset
  2171
     On error, the unix error code is left in the lastErrorNumber
81
claus
parents: 79
diff changeset
  2172
     instance variable.
claus
parents: 79
diff changeset
  2173
     Flags is currently ignored; it is there for ST-80 compatibility."
claus
parents: 79
diff changeset
  2174
claus
parents: 79
diff changeset
  2175
    ^ self sendTo:anAddressBuffer buffer:buffer start:1 for:buffer size flags:0 
claus
parents: 79
diff changeset
  2176
!
claus
parents: 79
diff changeset
  2177
claus
parents: 79
diff changeset
  2178
sendTo:anAddressBuffer buffer:aDataBuffer start:startIndex for:count flags:flags
claus
parents: 79
diff changeset
  2179
    "send datagramm data - fetch address of destination host from
claus
parents: 79
diff changeset
  2180
     anAddressBuffer, data from aDataBuffer starting at startIndex,
claus
parents: 79
diff changeset
  2181
     sending count bytes. 
claus
parents: 79
diff changeset
  2182
     Both must be ByteArray-like. The bytes in the addressBuffer must
claus
parents: 79
diff changeset
  2183
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
claus
parents: 79
diff changeset
  2184
     Return the number of bytes transmitted, or a negative number on error.
claus
parents: 79
diff changeset
  2185
     On error, the unix error code is left in the lastErrorNumber
71
claus
parents: 63
diff changeset
  2186
     instance variable."
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2187
82
claus
parents: 81
diff changeset
  2188
    |addrBytes addrLen nReceived portNo|
81
claus
parents: 79
diff changeset
  2189
82
claus
parents: 81
diff changeset
  2190
    "/ addressBuffer can be a 6-byte byteArray (last 2 bytes are portNo, msb-first)
claus
parents: 81
diff changeset
  2191
    "/ or an instance of IPSocketAddress
claus
parents: 81
diff changeset
  2192
    "/
claus
parents: 81
diff changeset
  2193
    anAddressBuffer class isBytes ifTrue:[
claus
parents: 81
diff changeset
  2194
	addrBytes := anAddressBuffer copyFrom:1 to:4.
claus
parents: 81
diff changeset
  2195
	portNo := ((anAddressBuffer at:5) bitShift:8)
claus
parents: 81
diff changeset
  2196
		  + (anAddressBuffer at:6).
claus
parents: 81
diff changeset
  2197
    ] ifFalse:[
claus
parents: 81
diff changeset
  2198
	addrBytes := anAddressBuffer hostAddress.
claus
parents: 81
diff changeset
  2199
	portNo := anAddressBuffer port.
81
claus
parents: 79
diff changeset
  2200
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2201
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2202
    OBJ oClass;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2203
    OBJ fp = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2204
    int nInstVars, nInstBytes, objSize;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2205
    int sock;
81
claus
parents: 79
diff changeset
  2206
    struct sockaddr_in sa;
claus
parents: 79
diff changeset
  2207
    struct sockaddr *saPtr = (struct sockaddr *)&sa;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2208
    int alen = sizeof(sa);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2209
    int n;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2210
    char *cp;
81
claus
parents: 79
diff changeset
  2211
    int _flags = 0;
claus
parents: 79
diff changeset
  2212
    int offs, nBytes;
83
claus
parents: 82
diff changeset
  2213
    unsigned long norder;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2214
81
claus
parents: 79
diff changeset
  2215
    _flags = __longIntVal(flags);
claus
parents: 79
diff changeset
  2216
 
claus
parents: 79
diff changeset
  2217
    if ((fp != nil) 
claus
parents: 79
diff changeset
  2218
     && __isSmallInteger(startIndex)
claus
parents: 79
diff changeset
  2219
     && __isSmallInteger(count)) {
110
7af19ae8693b use new FILE* wrapper macros (based on externalAddress)
Claus Gittinger <cg@exept.de>
parents: 106
diff changeset
  2220
	sock = fileno(__FILEVal(fp));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2221
81
claus
parents: 79
diff changeset
  2222
	if (addrBytes != nil) {
82
claus
parents: 81
diff changeset
  2223
	    if (! __isByteArray(addrBytes)) goto bad;
claus
parents: 81
diff changeset
  2224
	    cp = __ByteArrayInstPtr(addrBytes)->ba_element;
claus
parents: 81
diff changeset
  2225
	    n = __byteArraySize(addrBytes);
claus
parents: 81
diff changeset
  2226
	    if (alen < n) n = alen;
claus
parents: 81
diff changeset
  2227
/*
claus
parents: 81
diff changeset
  2228
printf("address is %d bytes ... %d.%d.%d.%d", n, cp[0], cp[1], cp[2], cp[3]);
claus
parents: 81
diff changeset
  2229
*/
claus
parents: 81
diff changeset
  2230
	    bcopy(cp, &sa.sin_addr.s_addr, n);
claus
parents: 81
diff changeset
  2231
	    sa.sin_family = AF_INET;
claus
parents: 81
diff changeset
  2232
	    sa.sin_port = htons((u_short) __intVal(portNo)); 
81
claus
parents: 79
diff changeset
  2233
	} else {
claus
parents: 79
diff changeset
  2234
	    alen = 0;
claus
parents: 79
diff changeset
  2235
	    saPtr = (struct sockaddr *)0;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2236
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2237
71
claus
parents: 63
diff changeset
  2238
	oClass = __Class(aDataBuffer);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2239
	switch (_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2240
	    case BYTEARRAY:
81
claus
parents: 79
diff changeset
  2241
		offs = __intVal(startIndex) - 1;
claus
parents: 79
diff changeset
  2242
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2243
	    case WORDARRAY:
81
claus
parents: 79
diff changeset
  2244
		offs = (__intVal(startIndex) - 1) * sizeof(short);
claus
parents: 79
diff changeset
  2245
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2246
	    case LONGARRAY:
81
claus
parents: 79
diff changeset
  2247
		offs = (__intVal(startIndex) - 1) * sizeof(long);
claus
parents: 79
diff changeset
  2248
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2249
	    case FLOATARRAY:
81
claus
parents: 79
diff changeset
  2250
		offs = (__intVal(startIndex) - 1) * sizeof(float);
claus
parents: 79
diff changeset
  2251
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2252
	    case DOUBLEARRAY:
81
claus
parents: 79
diff changeset
  2253
		offs = (__intVal(startIndex) - 1) * sizeof(double);
claus
parents: 79
diff changeset
  2254
#ifdef NEED_DOUBLE_ALIGN
claus
parents: 79
diff changeset
  2255
		offs += sizeof(long);
claus
parents: 79
diff changeset
  2256
#endif
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2257
		break;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2258
	    default:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2259
		goto bad;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2260
	}
81
claus
parents: 79
diff changeset
  2261
	nBytes = __intVal(count);
claus
parents: 79
diff changeset
  2262
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2263
	nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2264
	nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
81
claus
parents: 79
diff changeset
  2265
	objSize = __qSize(aDataBuffer) - nInstBytes;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2266
	cp = (char *)_InstPtr(aDataBuffer) + nInstBytes;
81
claus
parents: 79
diff changeset
  2267
	cp += offs;
claus
parents: 79
diff changeset
  2268
	if ((offs + nBytes) > objSize) {
82
claus
parents: 81
diff changeset
  2269
/*
81
claus
parents: 79
diff changeset
  2270
printf("cut off ...\n");
82
claus
parents: 81
diff changeset
  2271
*/
81
claus
parents: 79
diff changeset
  2272
	    nBytes = objSize - offs;
claus
parents: 79
diff changeset
  2273
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2274
82
claus
parents: 81
diff changeset
  2275
	norder = htonl(sa.sin_addr.s_addr);
claus
parents: 81
diff changeset
  2276
/*
claus
parents: 81
diff changeset
  2277
printf("sending %d bytes ... to ", nBytes);
claus
parents: 81
diff changeset
  2278
printf("%d.%d.%d.%d\n",
claus
parents: 81
diff changeset
  2279
		    (norder >> 24) & 0xFF,
claus
parents: 81
diff changeset
  2280
		    (norder >> 16) & 0xFF,
claus
parents: 81
diff changeset
  2281
		    (norder >> 8) & 0xFF,
claus
parents: 81
diff changeset
  2282
		    norder & 0xFF);
claus
parents: 81
diff changeset
  2283
*/
claus
parents: 81
diff changeset
  2284
81
claus
parents: 79
diff changeset
  2285
	__BEGIN_INTERRUPTABLE__
claus
parents: 79
diff changeset
  2286
	do {
claus
parents: 79
diff changeset
  2287
	    n = sendto(sock, cp, nBytes, _flags, saPtr, alen);
claus
parents: 79
diff changeset
  2288
	} while ((n < 0) && (errno == EINTR));
claus
parents: 79
diff changeset
  2289
	__END_INTERRUPTABLE__
claus
parents: 79
diff changeset
  2290
71
claus
parents: 63
diff changeset
  2291
	if (n < 0) {
claus
parents: 63
diff changeset
  2292
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2293
	}
71
claus
parents: 63
diff changeset
  2294
	RETURN (_MKSMALLINT(n));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2295
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2296
bad: ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  2297
%}.
71
claus
parents: 63
diff changeset
  2298
    "
claus
parents: 63
diff changeset
  2299
     arrive here if you try to send from an invalid buffer
claus
parents: 63
diff changeset
  2300
     (i.e. not ByteArray-like), 
claus
parents: 63
diff changeset
  2301
     or if the addressBuffer is nonNil AND not a ByteArray/String 
claus
parents: 63
diff changeset
  2302
     or if the addressBuffer is nonNil AND too small.
claus
parents: 63
diff changeset
  2303
    "
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  2304
    self primitiveFailed
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  2305
! !