Socket.st
author claus
Thu, 10 Aug 1995 20:36:43 +0200
changeset 85 df13b436b54e
parent 84 d401ce0001dc
child 91 01e72b1e93de
permissions -rw-r--r--
.
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
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
Socket comment:'
4
1f66800df351 *** empty log message ***
claus
parents: 3
diff changeset
    22
COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    23
	      All Rights Reserved
36
d046fe84ea67 *** empty log message ***
claus
parents: 31
diff changeset
    24
85
claus
parents: 84
diff changeset
    25
$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.27 1995-08-10 18:36:21 claus Exp $
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    26
'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    27
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    28
!Socket class methodsFor:'documentation'!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    29
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    30
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    31
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    32
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    33
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    34
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    35
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    36
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    37
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    38
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    39
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    40
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    41
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    42
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    43
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    44
version
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    45
"
85
claus
parents: 84
diff changeset
    46
$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.27 1995-08-10 18:36:21 claus Exp $
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    47
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    48
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    49
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    50
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    51
"
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    52
    This class provides access to (unix-)sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    53
    The message protocol is preliminary, until someone tells me how
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    54
    other smalltalk's socket interfaces look like.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    55
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    56
    Also, currently there is almost no support for other than IP 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    57
    sockets - this will be added in the future.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    58
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    59
    code using ST-80 Sockets i.e. RemoteInvocation), there is some old interface
71
claus
parents: 63
diff changeset
    60
    still provided. 
claus
parents: 63
diff changeset
    61
    This will vanish; use the family:type: or newTCPxxx and newUDPxxx interface,
claus
parents: 63
diff changeset
    62
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
    63
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
    64
claus
parents: 63
diff changeset
    65
    ST/X does not use IPSocketAddress, UDSocketAddress erc; all addressing
claus
parents: 63
diff changeset
    66
    is done by passing appropriate string- or byteArray objects containing
claus
parents: 63
diff changeset
    67
    the addresses. This may change, too.
claus
parents: 63
diff changeset
    68
claus
parents: 63
diff changeset
    69
    TODO: cleanup historic leftovers, implement other than inet domain stuff.
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    70
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    71
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    72
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    73
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    74
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    75
    example (get help info from an nntp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    76
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    77
	|sock|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    78
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    79
	sock := Socket 
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    80
		    newTCPclientToHost:(OperatingSystem 
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    81
					    getEnvironment:'NNTPSERVER') 
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    82
				  port:'nntp'.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    83
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    84
	sock buffered:false.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    85
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    86
	sock nextPutAll:'HELP'; cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    87
	[:exit |
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    88
	    |line|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    89
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    90
	    line := sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    91
	    line = '.' ifTrue:[exit value:nil].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    92
	    Transcript showCr:line.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    93
	] loopWithExit.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    94
	sock close
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    95
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    96
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    97
    example (connect to an ftp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    98
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    99
	|sock|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   100
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   101
	sock := Socket 
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   102
		    newTCPclientToHost:(OperatingSystem getHostName) 
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   103
				  port:'ftp'.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   104
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   105
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   106
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   107
	sock nextPutAll:('USER ' , OperatingSystem getLoginName); cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   108
	Transcript showCr:sock nextLine.
74
claus
parents: 71
diff changeset
   109
	sock nextPutAll:('PASS ' , 'your password here'); cr.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   110
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   111
	sock nextPutAll:'LIST'; cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   112
	Transcript showCr:sock nextLine.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   113
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   114
	'dont know enough of the ftp protocol to continue here ...'
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   115
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   116
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   117
    example (connect to an snmp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   118
74
claus
parents: 71
diff changeset
   119
	|sock port|
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   120
74
claus
parents: 71
diff changeset
   121
	sock := Socket newUDP.
claus
parents: 71
diff changeset
   122
	port := Socket portOfService:'snmp'.
claus
parents: 71
diff changeset
   123
	sock connectTo:(OperatingSystem getHostName) port:port.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   124
	sock buffered:false.
74
claus
parents: 71
diff changeset
   125
	Transcript showCr:'got it'.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   126
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   127
    example (await connection from a client and read some data):
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   128
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   129
	|connectSock sock|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   130
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   131
	connectSock := Socket provide:9996.  
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   132
	Transcript showCr:'listen ..'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   133
	connectSock listenFor:5.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   134
	Transcript showCr:'wait'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   135
	connectSock readWait.  
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   136
	Transcript showCr:'accept'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   137
	sock := Socket new acceptOn:self.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   138
	Transcript showCr:'close'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   139
	connectSock close.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   140
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   141
	Transcript showCr:'server: got it'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   142
	'can now do transfer via sock'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   143
	Transcript showCr:'read'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   144
	Transcript showCr:('got: ' , sock nextLine).
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   145
	sock close
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   146
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   147
    example (connect to above server and send some data):
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   148
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   149
	|sock|
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   150
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   151
	sock := Socket connectTo:9996 on:'porty'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   152
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   153
	Transcript showCr:'client: got it'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   154
	'can now do transfer via sock'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   155
	Transcript showCr:'sending <hello>'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   156
	sock nextPutLine:'hello'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   157
	sock close
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   158
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   159
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   160
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   161
!Socket primitiveDefinitions!
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   162
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   163
%{
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   164
#include <stdio.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   165
#include <errno.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   166
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   167
#ifdef LINUX
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   168
/* kludge to avoid some redefines ... */
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   169
# define _ARPA_NAMESER_H
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   170
# define _NETINET_TCP_H
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   171
#endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   172
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   173
#ifndef transputer
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   174
# include <fcntl.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   175
# include <sys/types.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   176
# ifdef IRIS
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   177
   /* no socket.h on 4.0.5h ?!?!? */
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   178
#  define AF_UNIX 1
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   179
#  define AF_INET 2
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   180
#  define SOCK_STREAM 1
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   181
#  define SOCK_DGRAM  2
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   182
#  define SOCK_RAW    3
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   183
# else
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   184
#  include <sys/socket.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   185
# endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   186
# include <netdb.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   187
# include <netinet/in.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   188
# if ! (defined(SYSV3) && defined(mc88k))
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   189
#  include <netinet/tcp.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   190
# endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   191
#endif
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   192
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   193
/*
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   194
 * on some systems errno is a macro ... check for it here
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   195
 */
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   196
#ifndef errno
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   197
 extern errno;
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   198
#endif
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   199
71
claus
parents: 63
diff changeset
   200
static int __debugging__ = 0;
claus
parents: 63
diff changeset
   201
claus
parents: 63
diff changeset
   202
#ifdef DEBUG
claus
parents: 63
diff changeset
   203
# define DBGPRINTF(x)    printf x
claus
parents: 63
diff changeset
   204
#else
claus
parents: 63
diff changeset
   205
# define DBGPRINTF(x)    /* as nothing */
claus
parents: 63
diff changeset
   206
#endif
claus
parents: 63
diff changeset
   207
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   208
%}
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   209
! !
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   210
75
claus
parents: 74
diff changeset
   211
!Socket class methodsFor:'Signal constants'!
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   212
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   213
brokenConnectionSignal
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   214
    "return the signal used to tell broken connections.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   215
     Since in unix, this is the same as the broken pipe signal,
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   216
     return that one.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   217
     (for other Operatingsystems, this may change ..)"
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   218
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   219
    ^ PipeStream brokenPipeSignal
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   220
! !
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   221
71
claus
parents: 63
diff changeset
   222
!Socket class methodsFor:'debugging'!
claus
parents: 63
diff changeset
   223
claus
parents: 63
diff changeset
   224
debug:aBoolean
claus
parents: 63
diff changeset
   225
    "turn on/off internal debugprints.
claus
parents: 63
diff changeset
   226
     This method is for ST/X debugging only and
claus
parents: 63
diff changeset
   227
     may  be removed in later versions"
claus
parents: 63
diff changeset
   228
claus
parents: 63
diff changeset
   229
%{  /* NOCONTEXT */
claus
parents: 63
diff changeset
   230
claus
parents: 63
diff changeset
   231
    __debugging__ = (aBoolean == true);
claus
parents: 63
diff changeset
   232
%}
claus
parents: 63
diff changeset
   233
! !
claus
parents: 63
diff changeset
   234
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   235
!Socket class methodsFor:'queries'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   236
6
claus
parents: 4
diff changeset
   237
ipAddressOfHost:aHostName
claus
parents: 4
diff changeset
   238
    "return the IP (internet-) number for a hostname"
claus
parents: 4
diff changeset
   239
claus
parents: 4
diff changeset
   240
    |b1 b2 b3 b4|
claus
parents: 4
diff changeset
   241
claus
parents: 4
diff changeset
   242
%{
claus
parents: 4
diff changeset
   243
    struct sockaddr_in sa ;
claus
parents: 4
diff changeset
   244
    struct hostent *hp ;
claus
parents: 4
diff changeset
   245
    long addr;
claus
parents: 4
diff changeset
   246
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   247
    if (__isString(aHostName)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   248
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   249
	if ((addr = inet_addr((char *) _stringVal(aHostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   250
	    /* is Internet addr in octet notation */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   251
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)); 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   252
	    sa.sin_family = AF_INET;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   253
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   254
	    /* do we know the host's address? */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   255
	    if ((hp = gethostbyname((char *) _stringVal(aHostName))) == NULL) {
71
claus
parents: 63
diff changeset
   256
		DBGPRINTF(("unknown host\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   257
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   258
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   259
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   260
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   261
	}
6
claus
parents: 4
diff changeset
   262
    }
claus
parents: 4
diff changeset
   263
    /* if the addressing family is not AF_INET, return nil */
claus
parents: 4
diff changeset
   264
    if (sa.sin_family != AF_INET) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   265
	RETURN ( nil );
6
claus
parents: 4
diff changeset
   266
    }
claus
parents: 4
diff changeset
   267
    b1 = _MKSMALLINT((sa.sin_addr.s_addr >> 24) & 0xFF);
claus
parents: 4
diff changeset
   268
    b2 = _MKSMALLINT((sa.sin_addr.s_addr >> 16) & 0xFF);
claus
parents: 4
diff changeset
   269
    b3 = _MKSMALLINT((sa.sin_addr.s_addr >> 8) & 0xFF);
claus
parents: 4
diff changeset
   270
    b4 = _MKSMALLINT((sa.sin_addr.s_addr >> 0) & 0xFF);
claus
parents: 4
diff changeset
   271
%}
claus
parents: 4
diff changeset
   272
.
claus
parents: 4
diff changeset
   273
    ^ ByteArray with:b1 with:b2 with:b3 with:b4
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   274
71
claus
parents: 63
diff changeset
   275
    "
claus
parents: 63
diff changeset
   276
     Socket ipAddressOfHost:'clam'
claus
parents: 63
diff changeset
   277
     Socket ipAddressOfHost:'porty'
claus
parents: 63
diff changeset
   278
     Socket ipAddressOfHost:'josef'
claus
parents: 63
diff changeset
   279
     Socket ipAddressOfHost:'styx.com'
claus
parents: 63
diff changeset
   280
    "
6
claus
parents: 4
diff changeset
   281
!
claus
parents: 4
diff changeset
   282
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   283
hostWithIpAddress:anAddress
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   284
    "return the hostname for an IP (internet-) address"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   285
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   286
    |b1 b2 b3 b4|
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   287
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   288
    b1 := anAddress at:1.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   289
    b2 := anAddress at:2.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   290
    b3 := anAddress at:3.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   291
    b4 := anAddress at:4.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   292
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   293
    struct sockaddr_in sa ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   294
    struct hostent *hp ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   295
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   296
    if (__bothSmallInteger(b1, b2) && __bothSmallInteger(b3, b4)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   297
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   298
	sa.sin_addr.s_addr = _intVal(b1) & 0xFF;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   299
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b2) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   300
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b3) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   301
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b4) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   302
	sa.sin_family = AF_INET;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   303
	/* do we know the host's address? */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   304
	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
   305
	if (hp == NULL) {
71
claus
parents: 63
diff changeset
   306
	    DBGPRINTF(("unknown address: %d.%d.%d.%d\n", 
claus
parents: 63
diff changeset
   307
		       _intVal(b1), _intVal(b2), _intVal(b3), _intVal(b4)));
claus
parents: 63
diff changeset
   308
	} else {
claus
parents: 63
diff changeset
   309
	    sa.sin_family = hp->h_addrtype;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   310
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   311
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   312
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   313
    /* if the addressing family is not AF_INET, return nil */
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   314
    if (sa.sin_family != AF_INET) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   315
	RETURN ( nil );
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   316
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   317
    if (hp != NULL)
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   318
	RETURN (_MKSTRING(hp->h_name COMMA_CON));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   319
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   320
    RETURN (_MKSTRING(inet_ntoa(sa.sin_addr) COMMA_CON));
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   321
%}
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   322
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   323
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   324
     Socket ipAddressOfHost:'clam'
71
claus
parents: 63
diff changeset
   325
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam') 
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   326
     Socket ipAddressOfHost:'porty'
71
claus
parents: 63
diff changeset
   327
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty') 
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   328
     Socket hostWithIpAddress:#[1 2 3 4]
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   329
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   330
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   331
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   332
portOfService:aNameOrNumber
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   333
    "returns the port-number for a given service
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   334
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   335
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   336
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   337
    struct servent *servent = NULL;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   338
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   339
    if (__isSmallInteger(aNameOrNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   340
	servent = getservbyport(htons(_intVal(aNameOrNumber)), "tcp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   341
	if (servent != NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   342
	    RETURN ( aNameOrNumber );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   343
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   344
	RETURN ( aNameOrNumber );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   345
    }
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   346
    if (__isString(aNameOrNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   347
	servent = getservbyname((char *) _stringVal(aNameOrNumber), "tcp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   348
	if (servent != NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   349
	    RETURN ( _MKSMALLINT(ntohs(servent->s_port)) );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   350
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   351
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   352
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   353
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   354
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   355
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   356
     Socket portOfService:'finger'
74
claus
parents: 71
diff changeset
   357
     Socket portOfService:'nntp'  
claus
parents: 71
diff changeset
   358
     Socket portOfService:'echo' 
claus
parents: 71
diff changeset
   359
     Socket portOfService:'snmp' 
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   360
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   361
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   362
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   363
protocolOfService:aNameOrNumber
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   364
    "returns the protocol (as string) for a given service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   365
     or nil if no such service exists."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   366
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   367
    struct servent *servent = NULL;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   368
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   369
    if (__isSmallInteger(aNameOrNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   370
	servent = getservbyport(htons(_intVal(aNameOrNumber)), "tcp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   371
	if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   372
	    servent = getservbyport(htons(_intVal(aNameOrNumber)), "udp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   373
	    if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   374
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   375
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   376
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   377
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   378
	if (__isString(aNameOrNumber)) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   379
	    servent = getservbyname((char *) _stringVal(aNameOrNumber), "tcp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   380
	    if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   381
		servent = getservbyname((char *) _stringVal(aNameOrNumber), "udp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   382
		if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   383
		    RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   384
		}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   385
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   386
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   387
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   388
    if (servent) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   389
	RETURN ( _MKSTRING(servent->s_proto COMMA_CON) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   390
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   391
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   392
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   393
    "
74
claus
parents: 71
diff changeset
   394
     Socket protocolOfService:'finger' 
claus
parents: 71
diff changeset
   395
     Socket protocolOfService:'nntp'  
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   396
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   397
     Socket protocolOfService:79
74
claus
parents: 71
diff changeset
   398
     Socket protocolOfService:'snmp' 
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   399
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   400
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   401
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   402
domainOfProtocol:aProtocol
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   403
    "given a protocols name (i.e. tcp, udp etc) return the domain.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   404
     This method needs more ... - or is there a way to get this from the system ?"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   405
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   406
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   407
     tcp/ip stuff
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   408
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   409
    (aProtocol = 'tcp') ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   410
    (aProtocol = 'udp') ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   411
    (aProtocol = 'ip')  ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   412
    "
71
claus
parents: 63
diff changeset
   413
     unix domain
claus
parents: 63
diff changeset
   414
    "
claus
parents: 63
diff changeset
   415
    (aProtocol = 'ud')  ifTrue:[^ #unix].
claus
parents: 63
diff changeset
   416
claus
parents: 63
diff changeset
   417
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   418
     x25 stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   419
     appletalk stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   420
     other stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   421
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   422
    ^ nil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   423
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   424
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   425
     Socket domainOfProtocol:'tcp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   426
     Socket domainOfProtocol:'ucp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   427
     Socket domainOfProtocol:(Socket protocolOfService:'nntp')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   428
     Socket domainOfProtocol:(Socket protocolOfService:'echo')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   429
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   430
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   431
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   432
typeOfProtocol:aProtocol
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   433
    "given a protocols name (i.e. tcp, udp etc) return the connection type.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   434
     This method needs more ... - or is there a way to get this from the system ?"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   435
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   436
    (aProtocol = 'tcp') ifTrue:[^ #stream].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   437
    (aProtocol = 'udp') ifTrue:[^ #datagram].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   438
    (aProtocol = 'ip')  ifTrue:[^ #raw].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   439
    "
71
claus
parents: 63
diff changeset
   440
     unix domain
claus
parents: 63
diff changeset
   441
    "
claus
parents: 63
diff changeset
   442
    (aProtocol = 'ud')  ifTrue:[^ #stream].
claus
parents: 63
diff changeset
   443
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   444
     x25 stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   445
     appletalk stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   446
     other stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   447
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   448
    ^ nil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   449
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   450
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   451
     Socket typeOfProtocol:'tcp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   452
     Socket typeOfProtocol:'ucp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   453
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   454
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   455
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   456
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   457
71
claus
parents: 63
diff changeset
   458
!Socket class methodsFor:'easy tcp/ip instance creation'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   459
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   460
connectTo:service on:host
71
claus
parents: 63
diff changeset
   461
    "standard & easy client setup: 
claus
parents: 63
diff changeset
   462
	create new client tcp socket, bind and connect; 
claus
parents: 63
diff changeset
   463
	return the socket.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   464
     The system will block (interruptable), until the connection is 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   465
     established."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   466
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   467
    ^ (self new) for:host port:(self portOfService:service).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   468
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   469
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   470
     Socket connectTo:9995 on:'clam'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   471
     Socket connectTo:'finger' on:'clam'
71
claus
parents: 63
diff changeset
   472
     Socket connectTo:'ftp' on:'clam'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   473
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   474
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   475
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   476
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   477
provide:service
71
claus
parents: 63
diff changeset
   478
    "standard & easy server setup: 
claus
parents: 63
diff changeset
   479
	create a new TCP server socket providing a service."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   480
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   481
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   482
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   483
    newSock := (self new) for:nil port:(self portOfService:service).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   484
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   485
	newSock listenFor:5.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   486
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   487
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   488
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   489
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   490
     Socket provide:9995
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   491
     (Socket provide:9996) accept
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   492
     Socket provide:'nntp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   493
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   494
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   495
71
claus
parents: 63
diff changeset
   496
!Socket class methodsFor:'ST80 queries'!
claus
parents: 63
diff changeset
   497
claus
parents: 63
diff changeset
   498
sockStream
claus
parents: 63
diff changeset
   499
    "return the type code for stream sockets"
claus
parents: 63
diff changeset
   500
claus
parents: 63
diff changeset
   501
    ^ #stream
claus
parents: 63
diff changeset
   502
! !
claus
parents: 63
diff changeset
   503
claus
parents: 63
diff changeset
   504
!Socket class methodsFor:'ST80 instance creation'!
claus
parents: 63
diff changeset
   505
claus
parents: 63
diff changeset
   506
family:domainSymbol type:typeSymbol
claus
parents: 63
diff changeset
   507
    "create a socket for domain and type - ST80 simply uses a different name.
claus
parents: 63
diff changeset
   508
     Domain must be one of the symbols: #inet, #unix, #ns, #appletalk or #ns;
claus
parents: 63
diff changeset
   509
     Type must be #stream, #datagram or #raw
claus
parents: 63
diff changeset
   510
claus
parents: 63
diff changeset
   511
     XXX: currently only the #inet domain is supported"
claus
parents: 63
diff changeset
   512
claus
parents: 63
diff changeset
   513
    ^ self domain:domainSymbol type:typeSymbol
claus
parents: 63
diff changeset
   514
claus
parents: 63
diff changeset
   515
    "
claus
parents: 63
diff changeset
   516
     Socket family:#inet type:#stream
claus
parents: 63
diff changeset
   517
     Socket family:#inet type:#datagram
claus
parents: 63
diff changeset
   518
     Socket family:#unix type:#stream
claus
parents: 63
diff changeset
   519
    "
claus
parents: 63
diff changeset
   520
! !
claus
parents: 63
diff changeset
   521
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   522
!Socket class methodsFor:'general instance creation'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   523
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   524
domain:domainSymbol type:type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   525
    "create a socket for domain and type -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   526
     neither any connect nor binding is done.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   527
     Domain must be one of the symbols: #inet, #unix, #ns, #appletalk or #ns;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   528
     Type must be #stream, #datagram or #raw
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   529
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   530
     XXX: currently only the #inet domain is supported"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   531
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   532
    ^ self new domain:domainSymbol type:type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   533
71
claus
parents: 63
diff changeset
   534
    "
claus
parents: 63
diff changeset
   535
     Socket domain:#inet type:#stream
claus
parents: 63
diff changeset
   536
     Socket domain:#inet type:#datagram
claus
parents: 63
diff changeset
   537
     Socket domain:#unix type:#stream
claus
parents: 63
diff changeset
   538
     Socket domain:#appletalk type:#stream
claus
parents: 63
diff changeset
   539
     Socket domain:#DECnet type:#stream
claus
parents: 63
diff changeset
   540
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   541
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   542
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   543
newUDP
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   544
    "create a UDP socket - no binding or other setup is done,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   545
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   546
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   547
    ^ self new domain:#inet type:#datagram
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   548
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   549
    "Socket newUDP"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   550
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   551
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   552
newUDP:aServiceOrNil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   553
    "create a UDP socket for a service -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   554
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   555
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   556
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   557
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   558
    newSock := self newUDP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   559
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   560
	newSock bindTo:(self portOfService:aServiceOrNil) address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   561
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   562
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   563
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   564
    "Socket newUDP:nil"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   565
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   566
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   567
newTCP
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   568
    "create a TCP socket - no binding or other setup is done,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   569
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   570
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   571
    ^ self new domain:#inet type:#stream 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   572
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   573
    "Socket newUDP"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   574
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   575
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   576
newTCP:aServiceOrNil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   577
    "create a TCP socket for a service -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   578
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   579
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   580
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   581
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   582
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   583
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   584
	newSock bindTo:(self portOfService:aServiceOrNil) address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   585
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   586
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   587
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   588
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   589
    "Socket newTCP:'nntp'"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   590
    "Socket newTCP:9995"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   591
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   592
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   593
newTCPclientToHost:hostname port:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   594
    "create a new TCP client socket connecting to a service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   595
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   596
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   597
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   598
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   599
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   600
	(newSock connectTo:hostname port:(self portOfService:aService)) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   601
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   602
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   603
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   604
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   605
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   606
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   607
    ^ (self new) for:hostname port:(self portOfService:aPort).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   608
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   609
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   610
      Socket newTCPclientToHost:'slsv6bt' port:'nntp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   611
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   612
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   613
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   614
newTCPserverAtPort:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   615
    "create a new TCP server socket providing service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   616
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   617
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   618
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   619
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   620
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   621
	(newSock bindTo:(self portOfService:aService) address:nil) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   622
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   623
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   624
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   625
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   626
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   627
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   628
    ^ (self new) for:nil port:aPort
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   629
"
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
newUDPserverAtPort:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   633
    "create a new UDP server socket providing service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   634
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   635
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   636
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   637
    newSock := self newUDP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   638
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   639
	(newSock bindTo:(self portOfService:aService) address:nil) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   640
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   641
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   642
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   643
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   644
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   645
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   646
    ^ (self new) for:nil udpPort:aPort
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   647
"
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   648
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   649
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   650
!Socket methodsFor:'socket setup'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   651
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   652
domain:domainArg type:typeArg
71
claus
parents: 63
diff changeset
   653
    "set up socket with domain and type.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   654
     This is a low level entry; no binding, listening or connect
71
claus
parents: 63
diff changeset
   655
     is done. Both arguments must be symbols from one of
claus
parents: 63
diff changeset
   656
     #inet,#unix, #appletalk, #x25 .. and #stream, #datagram, #raw resp."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   657
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   658
    |errorNr|
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   659
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   660
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   661
	^ self error:'already created'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   662
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   663
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   664
    FILE *fp;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   665
    int dom, typ, proto, sock;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   666
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   667
    if (! __isSymbol(domainArg)) { 
71
claus
parents: 63
diff changeset
   668
	DBGPRINTF(("bad domain\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   669
	RETURN ( nil );
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   670
    }
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   671
    if (! __isSymbol(typeArg)) { 
71
claus
parents: 63
diff changeset
   672
	DBGPRINTF(("bad type\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   673
	RETURN ( nil );
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   674
    }
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   675
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   676
    /*
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   677
     * get address-family
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   678
     */
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   679
#ifdef AF_UNIX
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   680
    if (domainArg == @symbol(unix))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   681
	dom = AF_UNIX;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   682
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   683
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   684
#ifdef AF_INET
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   685
    if (domainArg == @symbol(inet))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   686
	dom = AF_INET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   687
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   688
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   689
#ifdef AF_NS
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   690
    if (domainArg == @symbol(ns))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   691
	dom = AF_NS;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   692
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   693
#endif
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   694
#ifdef AF_DECnet
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   695
    if (domainArg == @symbol(DECnet))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   696
	dom = AF_DECnet;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   697
    else
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   698
#endif
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   699
#ifdef AF_APPLETALK
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   700
    if (domainArg == @symbol(appletalk))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   701
	dom = AF_APPLETALK;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   702
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   703
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   704
#ifdef AF_X25
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   705
    if (domainArg == @symbol(x25))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   706
	dom = AF_X25;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   707
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   708
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   709
    {
71
claus
parents: 63
diff changeset
   710
	DBGPRINTF(("unknown domain <%s>\n", _stringVal(domainArg)));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   711
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   712
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   713
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   714
#ifdef SOCK_STREAM
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   715
    if (typeArg == @symbol(stream))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   716
	typ = SOCK_STREAM;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   717
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   718
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   719
#ifdef SOCK_DGRAM
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   720
    if (typeArg == @symbol(datagram))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   721
	typ = SOCK_DGRAM;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   722
    else 
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   723
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   724
#ifdef SOCK_RAW
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   725
    if (typeArg == @symbol(raw))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   726
	typ = SOCK_RAW;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   727
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   728
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   729
#ifdef SOCK_SEQPACKET
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   730
    if (typeArg == @symbol(seqPacket))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   731
	typ = SOCK_SEQPACKET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   732
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   733
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   734
    {
71
claus
parents: 63
diff changeset
   735
	DBGPRINTF(("bad type <%s>\n", _stringVal(typeArg)));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   736
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   737
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   738
81
claus
parents: 79
diff changeset
   739
    __BEGIN_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
   740
    do {
82
claus
parents: 81
diff changeset
   741
printf("opening socket type=%d\n", typ);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   742
	sock = socket(dom, typ, 0);
6
claus
parents: 4
diff changeset
   743
    } while ((sock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
   744
    __END_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
   745
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   746
    if (sock < 0) {
71
claus
parents: 63
diff changeset
   747
	DBGPRINTF(("socket call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   748
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   749
    } else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   750
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   751
	 * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   752
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   753
	fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   754
	if (! fp) {
71
claus
parents: 63
diff changeset
   755
	    DBGPRINTF(("fdopen call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   756
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
   757
	    __BEGIN_INTERRUPTABLE__
claus
parents: 79
diff changeset
   758
	    close(sock);
claus
parents: 79
diff changeset
   759
	    __END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   760
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   761
	    _INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   762
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   763
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   764
%}
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   765
.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   766
    "all ok?"
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   767
    filePointer notNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   768
	domain := domainArg.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   769
	socketType := typeArg.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   770
    ] ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   771
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   772
    ].
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   773
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   774
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   775
     Socket new domain:#inet type:#stream
71
claus
parents: 63
diff changeset
   776
     Socket new domain:#unix type:#stream
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   777
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   778
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   779
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   780
for:hostName udpPort:portNr
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   781
    "setup for a UDP socket (i.e. inet domain, datagram type) 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   782
     if hostname is nil, a server port is opened;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   783
     otherwise a client port to the server on host.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   784
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   785
     HISTORIC LEFTOVER:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   786
     This method will vanish, as soon as the low level
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   787
     connect/bind works,"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   788
71
claus
parents: 63
diff changeset
   789
    self obsoleteMethodWarning.
claus
parents: 63
diff changeset
   790
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   791
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   792
	^ self error:'already created'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   793
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   794
    (portNr isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   795
	^ self error:'invalid portNr'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   796
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   797
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   798
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   799
    struct hostent *hp ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   800
    int a, sock ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   801
    long addr;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   802
    FILE *fp;
6
claus
parents: 4
diff changeset
   803
    int ret;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   804
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   805
    if (hostName != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   806
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   807
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   808
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   809
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   810
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   811
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   812
	    sa.sin_family = AF_INET ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   813
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   814
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   815
	     * is hostname - 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   816
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   817
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   818
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
71
claus
parents: 63
diff changeset
   819
		DBGPRINTF(("unknown host\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   820
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   821
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   822
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   823
	    sa.sin_family = hp->h_addrtype ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   824
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   825
    } else
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   826
	sa.sin_family = AF_INET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   827
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   828
    /*
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   829
     * create the socket
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   830
     */
81
claus
parents: 79
diff changeset
   831
    __BEGIN_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
   832
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   833
	sock = socket(sa.sin_family, SOCK_DGRAM, 0);
6
claus
parents: 4
diff changeset
   834
    } while ((sock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
   835
    __END_INTERRUPTABLE__
claus
parents: 79
diff changeset
   836
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   837
    if (sock < 0) {
71
claus
parents: 63
diff changeset
   838
	DBGPRINTF(("socket call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   839
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   840
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   841
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   842
	 * ok,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   843
	 * connect/bind 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   844
	 */
81
claus
parents: 79
diff changeset
   845
	__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   846
	if (hostName == nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   847
	    sa.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   848
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   849
		ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   850
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   851
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   852
	    sa.sin_port = htons((u_short) _intVal(portNr)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   853
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   854
		ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   855
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   856
	}
81
claus
parents: 79
diff changeset
   857
	__END_INTERRUPTABLE__
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   858
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   859
	if (ret < 0) {
71
claus
parents: 63
diff changeset
   860
	    DBGPRINTF(("bind/connect call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   861
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
   862
	    __BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   863
	    close(sock) ;
81
claus
parents: 79
diff changeset
   864
	    __END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   865
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   866
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   867
	     * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   868
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   869
	    fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   870
	    if (! fp) {
71
claus
parents: 63
diff changeset
   871
		DBGPRINTF(("fdopen call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   872
		_INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
   873
		__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   874
		close(sock);
81
claus
parents: 79
diff changeset
   875
		__END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   876
	    } else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   877
/*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   878
		setbuf(fp, NULL);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   879
 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   880
		_INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   881
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   882
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   883
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   884
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   885
    filePointer isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   886
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   887
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   888
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   889
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   890
    buffered := false.
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   891
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   892
    mode := #readwrite.
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   893
    binary := false.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   894
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   895
    domain := #inet.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   896
    socketType := #datagram.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   897
    protocol := portNr.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   898
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   899
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   900
     Socket new for:'clam' udpPort:(Socket portOfService:'echo')
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   901
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   902
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   903
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   904
for:hostName port:portNr
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   905
    "setup for a TCP socket (i.e. inet domain, stream type) 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   906
     If hostname is nil, a server port is opened,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   907
     otherwise a client port to the server on host.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   908
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   909
     HISTORIC LEFTOVER:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   910
     This method will vanish, as soon as the low level
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   911
     connect/bind works,"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   912
71
claus
parents: 63
diff changeset
   913
    self obsoleteMethodWarning.
claus
parents: 63
diff changeset
   914
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   915
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   916
	^ self error:'already created'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   917
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   918
    (portNr isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   919
	^ self error:'invalid portNr'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   920
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   921
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   922
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   923
    struct hostent *hp ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   924
    int a, sock ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   925
    long addr;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   926
    FILE *fp;
6
claus
parents: 4
diff changeset
   927
    int ret;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   928
    int on = 1;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   929
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   930
    bzero((char *) &sa, sizeof(sa)) ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   931
    sa.sin_family = AF_INET;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   932
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   933
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   934
    if ((hostName != nil) && __isString(hostName)){
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   935
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   936
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   937
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   938
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   939
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   940
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   941
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   942
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   943
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   944
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   945
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
71
claus
parents: 63
diff changeset
   946
		DBGPRINTF(("unknown host\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   947
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   948
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   949
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   950
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   951
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   952
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   953
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   954
    /*
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   955
     * create the socket
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   956
     */
81
claus
parents: 79
diff changeset
   957
    __BEGIN_INTERRUPTABLE__
6
claus
parents: 4
diff changeset
   958
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   959
	sock = socket(sa.sin_family, SOCK_STREAM, 0);
6
claus
parents: 4
diff changeset
   960
    } while ((sock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
   961
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   962
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   963
    if (sock < 0) {
71
claus
parents: 63
diff changeset
   964
	DBGPRINTF(("socket call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   965
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   966
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   967
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   968
	 * connect/bind 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   969
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   970
	sa.sin_port = htons((u_short) _intVal(portNr)) ;
81
claus
parents: 79
diff changeset
   971
claus
parents: 79
diff changeset
   972
	__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   973
	if (hostName != nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   974
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   975
		ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   976
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   977
	} else {
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   978
#ifdef SO_REUSEADDR
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   979
	    /*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   980
	     * should I also do this for DGRAM sockets ?
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   981
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   982
	    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
71
claus
parents: 63
diff changeset
   983
		DBGPRINTF(("setsockopt - SO_REUSEADDR failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   984
	    }
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   985
#endif /* SO_REUSEADDR */
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   986
	    sa.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   987
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   988
		ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   989
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   990
	}
81
claus
parents: 79
diff changeset
   991
	__END_INTERRUPTABLE__
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   992
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   993
	if (ret < 0) { 
71
claus
parents: 63
diff changeset
   994
	    DBGPRINTF(("bind/connect call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   995
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
   996
	    __BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   997
	    close(sock) ;
81
claus
parents: 79
diff changeset
   998
	    __END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   999
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1000
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1001
	     * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1002
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1003
	    fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1004
	    if (! fp) {
71
claus
parents: 63
diff changeset
  1005
		DBGPRINTF(("fdopen failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1006
		_INST(lastErrorNumber) = _MKSMALLINT(errno);
81
claus
parents: 79
diff changeset
  1007
		__BEGIN_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1008
		close(sock);
81
claus
parents: 79
diff changeset
  1009
		__END_INTERRUPTABLE__
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1010
	    } else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1011
/*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1012
		setbuf(fp, NULL);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1013
*/
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1014
		_INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1015
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1016
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1017
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1018
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1019
    filePointer isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1020
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1021
    ].
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1022
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1023
    buffered := false.
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1024
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1025
    mode := #readwrite.
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1026
    binary := false.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1027
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1028
    domain := #inet.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1029
    socketType := #stream.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1030
    protocol := portNr.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1031
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1032
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1033
     Socket new for:'clam' port:(Socket portOfService:'echo')
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1034
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1035
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1036
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1037
!Socket methodsFor:'low level'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1038
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1039
closeFile
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1040
    "low level close"
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1041
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1042
%{  /* NOCONTEXT */
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1043
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1044
    OBJ t;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1045
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1046
    t = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1047
    if (t != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1048
	FILE *fp;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1049
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1050
	fp = MKFD(t);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1051
	fflush(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1052
	shutdown(fileno(fp), 2);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1053
	fclose(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1054
	_INST(filePointer) = nil;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1055
    }
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1056
%}
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1057
!
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1058
71
claus
parents: 63
diff changeset
  1059
bindTo:aSocketAddress 
claus
parents: 63
diff changeset
  1060
    "ST80 compatible bind:
claus
parents: 63
diff changeset
  1061
     the socketAddress object is supposed to respond to
claus
parents: 63
diff changeset
  1062
     portOrName and address requests."
claus
parents: 63
diff changeset
  1063
claus
parents: 63
diff changeset
  1064
    ^ self bindTo:(aSocketAddress portOrName)
claus
parents: 63
diff changeset
  1065
	   address:(aSocketAddress address)
claus
parents: 63
diff changeset
  1066
!
claus
parents: 63
diff changeset
  1067
claus
parents: 63
diff changeset
  1068
bindTo:portNrOrName address:address
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1069
    "low level bind - returns true if ok, false otherwise.
71
claus
parents: 63
diff changeset
  1070
     Currently only non-address binding is supported; 
claus
parents: 63
diff changeset
  1071
     i.e. address must always be nil.
claus
parents: 63
diff changeset
  1072
claus
parents: 63
diff changeset
  1073
     The interpretation of portNrOrName depends on the domain:
claus
parents: 63
diff changeset
  1074
	inet uses (4byte) byteArray like internet numbers,
claus
parents: 63
diff changeset
  1075
	unix uses pathname strings,
82
claus
parents: 81
diff changeset
  1076
	others use whatever will come up in the future
71
claus
parents: 63
diff changeset
  1077
     "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1078
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1079
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1080
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1081
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1082
%{
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1083
    OBJ t = _INST(filePointer);
71
claus
parents: 63
diff changeset
  1084
    OBJ myDomain;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1085
    int sock;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1086
    struct sockaddr_in insock;
6
claus
parents: 4
diff changeset
  1087
    int ret;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1088
    int on = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1089
    int ok;
82
claus
parents: 81
diff changeset
  1090
    extern OBJ LargeInteger;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1091
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1092
    if (!__isString(_INST(domain)) && !__isSymbol(_INST(domain))) {
71
claus
parents: 63
diff changeset
  1093
	DBGPRINTF(("invalid domain arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1094
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1095
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1096
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1097
    ok = 0;
71
claus
parents: 63
diff changeset
  1098
    myDomain = _INST(domain);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1099
#ifdef AF_INET
71
claus
parents: 63
diff changeset
  1100
    if (myDomain == @symbol(inet)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1101
	/*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1102
	 * INET addresses - port must be a smallinteger
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1103
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1104
	insock.sin_family = AF_INET;
71
claus
parents: 63
diff changeset
  1105
	if (! __isSmallInteger(portNrOrName)) {
claus
parents: 63
diff changeset
  1106
	    DBGPRINTF(("invalid port arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1107
	    RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1108
	}
82
claus
parents: 81
diff changeset
  1109
	insock.sin_port = htons((u_short) _intVal(portNrOrName));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1110
	if (address == nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1111
	    insock.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1112
	    ok = 1;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1113
	} else {
82
claus
parents: 81
diff changeset
  1114
	    if (__isInteger(address)) {
claus
parents: 81
diff changeset
  1115
		insock.sin_addr.s_addr = htonl(__longIntVal(address));
claus
parents: 81
diff changeset
  1116
		ok = 1;
claus
parents: 81
diff changeset
  1117
	    } else {
claus
parents: 81
diff changeset
  1118
		printf("SOCKET: address bind not yet supported\n");
claus
parents: 81
diff changeset
  1119
		RETURN (false);
claus
parents: 81
diff changeset
  1120
	    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1121
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1122
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1123
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1124
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1125
     * XXXX add addressing stuff for other domains here ...
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1126
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1127
#ifdef AF_UNIX
71
claus
parents: 63
diff changeset
  1128
    if (myDomain == @symbol(unix)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1129
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1130
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1131
#ifdef AF_X25
71
claus
parents: 63
diff changeset
  1132
    if (myDomain == @symbol(x25)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1133
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1134
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1135
#ifdef AF_NS
71
claus
parents: 63
diff changeset
  1136
    if (myDomain == @symbol(ns)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1137
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1138
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1139
#ifdef AF_APPLETALK
71
claus
parents: 63
diff changeset
  1140
    if (myDomain == @symbol(appletalk)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1141
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1142
#endif
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1143
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1144
    if (! ok) {
71
claus
parents: 63
diff changeset
  1145
	DBGPRINTF(("unsupported domain\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1146
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1147
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1148
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1149
    sock = fileno(MKFD(t));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1150
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1151
#ifdef SO_REUSEADDR
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1152
    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
71
claus
parents: 63
diff changeset
  1153
	DBGPRINTF(("setsockopt - SO_REUSEADDR failed\n"));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1154
    }
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1155
#endif /* SO_REUSEADDR */
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1156
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1157
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1158
	ret = bind(sock, (struct sockaddr *)&insock, sizeof(insock));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1159
    } while ((ret < 0) && (errno == EINTR));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1160
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1161
    if (ret < 0) {
71
claus
parents: 63
diff changeset
  1162
	DBGPRINTF(("bind failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1163
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1164
	RETURN (false);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1165
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1166
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1167
71
claus
parents: 63
diff changeset
  1168
    port := portNrOrName.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1169
    ^ true
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1170
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1171
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1172
     (Socket domain:#inet type:#stream)
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1173
	 bindTo:9999
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1174
	 address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1175
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1176
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1177
71
claus
parents: 63
diff changeset
  1178
connectTo:hostName port:portNrOrName
claus
parents: 63
diff changeset
  1179
    "low level connect; connect to port, portNrOrName on host, hostName.
claus
parents: 63
diff changeset
  1180
     Return true if ok, false otherwise.
claus
parents: 63
diff changeset
  1181
     Hostname must be a string, portNrOrName an integer port number (in inet domain)."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1182
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1183
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1184
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1185
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1186
%{
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1187
    OBJ t = _INST(filePointer);
71
claus
parents: 63
diff changeset
  1188
    OBJ myDomain;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1189
    struct sockaddr_in sa ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1190
    struct hostent *hp ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1191
    int a, sock ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1192
    long addr;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1193
    FILE *fp;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1194
    int ret;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1195
    int on = 1;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1196
    int ok;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1197
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1198
    if (! __isString(hostName)) {
71
claus
parents: 63
diff changeset
  1199
	DBGPRINTF(("invalid hostname arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1200
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1201
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1202
    if (!__isString(_INST(domain)) && !__isSymbol(_INST(domain))) {
71
claus
parents: 63
diff changeset
  1203
	DBGPRINTF(("invalid domain arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1204
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1205
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1206
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1207
    ok = 0;
71
claus
parents: 63
diff changeset
  1208
    myDomain = _INST(domain);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1209
#ifdef AF_INET
71
claus
parents: 63
diff changeset
  1210
    if (myDomain == @symbol(inet)) {
claus
parents: 63
diff changeset
  1211
	if (! __isSmallInteger(portNrOrName)) {
claus
parents: 63
diff changeset
  1212
	    DBGPRINTF(("invalid port arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1213
	    RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1214
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1215
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1216
	bzero((char *) &sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1217
	sa.sin_family = AF_INET;
71
claus
parents: 63
diff changeset
  1218
	sa.sin_port = htons((u_short) _intVal(portNrOrName)) ;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1219
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1220
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1221
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1222
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1223
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1224
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1225
	    ok = 1;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1226
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1227
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1228
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1229
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1230
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
71
claus
parents: 63
diff changeset
  1231
		DBGPRINTF(("unknown host:%s\n", _stringVal(hostName)));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1232
		RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1233
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1234
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1235
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1236
	    ok = 1;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1237
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1238
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1239
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1240
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1241
     * XXXX add addressing stuff for other domains here ...
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1242
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1243
#ifdef AF_UNIX
71
claus
parents: 63
diff changeset
  1244
    if (myDomain == @symbol(unix)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1245
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1246
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1247
#ifdef AF_X25
71
claus
parents: 63
diff changeset
  1248
    if (myDomain == @symbol(x25)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1249
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1250
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1251
#ifdef AF_NS
71
claus
parents: 63
diff changeset
  1252
    if (myDomain == @symbol(ns)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1253
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1254
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1255
#ifdef AF_APPLETALK
71
claus
parents: 63
diff changeset
  1256
    if (myDomain == @symbol(appletalk)) {
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1257
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1258
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1259
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1260
    if (! ok) {
71
claus
parents: 63
diff changeset
  1261
	DBGPRINTF(("unsupported domain\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1262
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1263
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1264
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1265
    sock = fileno(MKFD(t));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1266
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1267
    /* 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1268
     * connect 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1269
     */
81
claus
parents: 79
diff changeset
  1270
    __BEGIN_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1271
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1272
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1273
	ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1274
    } while ((ret < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1275
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1276
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1277
    if (ret < 0) { 
71
claus
parents: 63
diff changeset
  1278
	DBGPRINTF(("connect failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1279
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1280
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1281
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1282
%}.
71
claus
parents: 63
diff changeset
  1283
    port := portNrOrName.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1284
    ^ true
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1285
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1286
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1287
listenWithBacklog:aNumber
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1288
    "start listening; return true if ok, false on error"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1289
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1290
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1291
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1292
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1293
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1294
    OBJ fp = _INST(filePointer);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1295
    int sock;
6
claus
parents: 4
diff changeset
  1296
    int ret;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1297
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1298
    if (! __isSmallInteger(aNumber)) {
71
claus
parents: 63
diff changeset
  1299
	DBGPRINTF(("invalid arg\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1300
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1301
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1302
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1303
    sock = fileno(MKFD(fp));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1304
81
claus
parents: 79
diff changeset
  1305
    __BEGIN_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1306
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1307
	ret = listen(sock, _intVal(aNumber));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1308
    } while ((ret < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1309
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1310
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1311
    if (ret < 0) {
71
claus
parents: 63
diff changeset
  1312
	DBGPRINTF(("listen call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1313
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1314
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1315
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1316
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1317
    ^ true
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1318
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1319
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1320
listenFor:aNumber
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1321
    "same as listenWithBacklog: - for ST-80 compatibility"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1322
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1323
    ^ self listenWithBacklog:aNumber
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1324
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1325
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1326
acceptOn:aSocket
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1327
    "accept a connection on a server port (created with:'Socket>>onIPPort:')
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1328
     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1329
     Return the true if ok; false if not.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1330
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1331
     NOTICE: this method will block, if no connection is already pending.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1332
	     use readWait or Socket>>accept."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1333
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1334
    |serverSocketFd|
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1335
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1336
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1337
	^ self error:'already connected'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1338
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1339
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1340
    domain := aSocket domain.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1341
    socketType := aSocket type.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1342
    serverSocketFd := aSocket fileDescriptor.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1343
    serverSocketFd isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1344
	^ self error:'invalid server socket'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1345
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1346
    (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1347
	^ self error:'invalid server socket'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1348
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1349
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1350
    FILE *fp;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1351
    int flags;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1352
    int sock, newSock;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1353
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1354
    int alen;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1355
    struct hostent *he ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1356
    char dotted[20] ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1357
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1358
    alen = sizeof(sa) ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1359
    sock = _intVal(serverSocketFd);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1360
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1361
    flags = ioctl(sock, F_GETFL, 0);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1362
    ioctl(sock, F_SETFL, flags | O_NDELAY);
81
claus
parents: 79
diff changeset
  1363
    __BEGIN_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1364
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1365
	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1366
    } while ((newSock < 0) && (errno == EINTR));
81
claus
parents: 79
diff changeset
  1367
    __END_INTERRUPTABLE__
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1368
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1369
    if (newSock < 0) {
71
claus
parents: 63
diff changeset
  1370
	DBGPRINTF(("accept call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1371
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1372
	RETURN (false);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1373
    }
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1374
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1375
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1376
     * extract the partners address
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1377
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1378
#ifdef AF_INET
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1379
    if (_INST(domain) == @symbol(inet)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1380
	he = gethostbyaddr((char *) &sa.sin_addr.s_addr, alen, AF_INET) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1381
	if (! he) {
84
claus
parents: 83
diff changeset
  1382
	    unsigned long norder;
83
claus
parents: 82
diff changeset
  1383
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1384
	    norder = htonl(sa.sin_addr.s_addr) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1385
	    sprintf(dotted, "%d.%d.%d.%d",
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1386
		    (norder >> 24) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1387
		    (norder >> 16) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1388
		    (norder >> 8) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1389
		    norder & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1390
	}
71
claus
parents: 63
diff changeset
  1391
	DBGPRINTF(("accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1392
	_INST(peerName) = _MKSTRING((he ? he->h_name : dotted) COMMA_CON);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1393
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1394
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1395
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1396
    /* 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1397
     * make it a FILE * 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1398
     */
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1399
    fp = fdopen(newSock, "r+");
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1400
    if (! fp) {
71
claus
parents: 63
diff changeset
  1401
	DBGPRINTF(("fdopen call failed\n"));
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1402
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1403
	close(newSock);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1404
	RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1405
    } else {
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1406
/*
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1407
	setbuf(fp, NULL);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1408
*/
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1409
	_INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1410
    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1411
%}.
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1412
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1413
    buffered := false.
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1414
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1415
    mode := #readwrite.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1416
    binary := false.
71
claus
parents: 63
diff changeset
  1417
    port := aSocket port.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1418
    ^ true
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1419
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1420
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1421
accept
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1422
    "create a new TCP socket from accepting on the receiver.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1423
     This method will suspend the current process if no connection is waiting.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1424
     For ST-80 compatibility"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1425
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1426
    |newSock|
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1427
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1428
    self readWait.  
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1429
    newSock := self class new.
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1430
    (newSock acceptOn:self) ifFalse:[^ nil].
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1431
    ^ newSock
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1432
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1433
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1434
     |sock newSock|
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1435
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1436
     sock := Socket provide:8004.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1437
     sock listenFor:5.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1438
     newSock := sock accept.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1439
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1440
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1441
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1442
!Socket methodsFor:'queries'!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1443
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1444
getPeerName
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1445
    "return the peer name; thats the hostname (or dotted name) of the
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1446
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1447
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1448
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1449
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1450
81
claus
parents: 79
diff changeset
  1451
getName
claus
parents: 79
diff changeset
  1452
    "return the name; here, we return the ports name"
claus
parents: 79
diff changeset
  1453
claus
parents: 79
diff changeset
  1454
    ^ port printString
claus
parents: 79
diff changeset
  1455
!
claus
parents: 79
diff changeset
  1456
71
claus
parents: 63
diff changeset
  1457
port
claus
parents: 63
diff changeset
  1458
    "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
  1459
71
claus
parents: 63
diff changeset
  1460
    ^ port
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1461
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1462
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1463
domain
71
claus
parents: 63
diff changeset
  1464
    "return the sockets addressing domain (i.e. #inet, #unix, #x25, #appletalk)"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1465
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1466
    ^ domain
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1467
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1468
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1469
type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1470
    "return the sockets connection type (i.e. #datagram, #stream etc)"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1471
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1472
    ^ socketType
81
claus
parents: 79
diff changeset
  1473
!
claus
parents: 79
diff changeset
  1474
claus
parents: 79
diff changeset
  1475
isActive
claus
parents: 79
diff changeset
  1476
    ^ filePointer notNil
claus
parents: 79
diff changeset
  1477
! !
claus
parents: 79
diff changeset
  1478
claus
parents: 79
diff changeset
  1479
!Socket methodsFor:'ST-80 mimicri'!
claus
parents: 79
diff changeset
  1480
claus
parents: 79
diff changeset
  1481
errorReporter
claus
parents: 79
diff changeset
  1482
    ^ self
claus
parents: 79
diff changeset
  1483
!
claus
parents: 79
diff changeset
  1484
claus
parents: 79
diff changeset
  1485
notReadySignal
claus
parents: 79
diff changeset
  1486
    "for now - this is not yet raised"
claus
parents: 79
diff changeset
  1487
claus
parents: 79
diff changeset
  1488
    ^ Signal new
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1489
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1490
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1491
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1492
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1493
sendTimeout:seconds
71
claus
parents: 63
diff changeset
  1494
    "set the send timeout - for special applications only.
claus
parents: 63
diff changeset
  1495
     Not all operatingSystems offer this functionality
claus
parents: 63
diff changeset
  1496
     (returns false, if unsupported)"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1497
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1498
    |millis|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1499
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1500
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1501
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1502
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1503
    millis := (seconds * 1000) rounded.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1504
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1505
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET) && defined(HZ)
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1506
    if (__isSmallInteger(millis)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1507
	OBJ fp = _INST(filePointer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1508
	int sock;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1509
	int opt;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1510
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1511
	sock = fileno(MKFD(fp));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1512
	opt = _intVal(millis) / (1000 / HZ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1513
	setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&opt, sizeof(int));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1514
	RETURN(true);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1515
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1516
#endif
71
claus
parents: 63
diff changeset
  1517
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1518
    ^ false
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1519
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1520
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1521
receiveTimeout:seconds
71
claus
parents: 63
diff changeset
  1522
    "set the receive timeout - for special applications only.
claus
parents: 63
diff changeset
  1523
     Not all operatingSystems offer this functionality
claus
parents: 63
diff changeset
  1524
     (returns false, if unsupported)"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1525
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1526
    |millis|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1527
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1528
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1529
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1530
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1531
    millis := (seconds * 1000) rounded.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1532
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1533
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET) && defined(HZ)
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1534
    if (__isSmallInteger(millis)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1535
	OBJ fp = _INST(filePointer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1536
	int sock;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1537
	int opt;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1538
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1539
	sock = fileno(MKFD(fp));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1540
	opt = _intVal(millis) / (1000 / HZ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1541
	setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&opt, sizeof(int));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1542
	RETURN(true);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1543
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1544
#endif
71
claus
parents: 63
diff changeset
  1545
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1546
    ^ false
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1547
! !
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1548
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1549
!Socket methodsFor:'datagram transmission'!
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1550
81
claus
parents: 79
diff changeset
  1551
receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes
71
claus
parents: 63
diff changeset
  1552
    "receive datagramm data - put address of originating host into
81
claus
parents: 79
diff changeset
  1553
     anAddressBuffer, data into aBuffer. For ST-80 compatibility,
claus
parents: 79
diff changeset
  1554
     the addressBuffer may be a non-ByteArray; then, it must understand
claus
parents: 79
diff changeset
  1555
     the addressBytes-message (i.e. be a SocketAddress instance).
71
claus
parents: 63
diff changeset
  1556
     Return the number of bytes received, or a negative number on error.
claus
parents: 63
diff changeset
  1557
     On error, the unix error code is left in the lastErrorNumber
claus
parents: 63
diff changeset
  1558
     instance variable."
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1559
81
claus
parents: 79
diff changeset
  1560
    |addrBytes addrLen nReceived|
claus
parents: 79
diff changeset
  1561
claus
parents: 79
diff changeset
  1562
    addrBytes := ByteArray new:100.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1563
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1564
    OBJ oClass;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1565
    OBJ fp = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1566
    int nInstVars, nInstBytes, objSize;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1567
    int sock;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1568
    struct sockaddr_in sa ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1569
    int alen;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1570
    int n;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1571
    char *cp;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1572
    int flags = 0;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1573
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1574
    if (fp != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1575
	sock = fileno((FILE *)(_intVal(fp)));
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1576
71
claus
parents: 63
diff changeset
  1577
	oClass = __Class(aDataBuffer);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1578
	switch (_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1579
	    case BYTEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1580
	    case WORDARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1581
	    case LONGARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1582
	    case FLOATARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1583
	    case DOUBLEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1584
		break;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1585
	    default:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1586
		goto bad;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1587
	}
81
claus
parents: 79
diff changeset
  1588
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1589
	nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1590
	nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1591
	objSize = _Size(aDataBuffer) - nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1592
	cp = (char *)_InstPtr(aDataBuffer) + nInstBytes;
81
claus
parents: 79
diff changeset
  1593
	if (__isSmallInteger(startIndex)) {
claus
parents: 79
diff changeset
  1594
	    cp += __intVal(startIndex);
claus
parents: 79
diff changeset
  1595
	    objSize -= __intVal(startIndex);
claus
parents: 79
diff changeset
  1596
	}
claus
parents: 79
diff changeset
  1597
	if (__isSmallInteger(nBytes)) {
claus
parents: 79
diff changeset
  1598
	    if (__intVal(nBytes) < objSize) {
claus
parents: 79
diff changeset
  1599
		objSize = __intVal(nBytes);
claus
parents: 79
diff changeset
  1600
	    }
claus
parents: 79
diff changeset
  1601
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1602
81
claus
parents: 79
diff changeset
  1603
	__BEGIN_INTERRUPTABLE__
claus
parents: 79
diff changeset
  1604
	do {
claus
parents: 79
diff changeset
  1605
	    if (addrBytes == nil) {
claus
parents: 79
diff changeset
  1606
		n = recvfrom(sock, cp, objSize, flags, (struct sockaddr *) 0, 0);
claus
parents: 79
diff changeset
  1607
	    } else {
claus
parents: 79
diff changeset
  1608
		n = recvfrom(sock, cp, objSize, flags, (struct sockaddr *) &sa, &alen);
claus
parents: 79
diff changeset
  1609
	    }
claus
parents: 79
diff changeset
  1610
	} while ((n < 0) && (errno == EINTR));
claus
parents: 79
diff changeset
  1611
	__END_INTERRUPTABLE__
claus
parents: 79
diff changeset
  1612
claus
parents: 79
diff changeset
  1613
	if (n >= 0) {
claus
parents: 79
diff changeset
  1614
	    if (addrBytes != nil) {
claus
parents: 79
diff changeset
  1615
		oClass = __Class(addrBytes);
claus
parents: 79
diff changeset
  1616
		if ((_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) != BYTEARRAY) 
claus
parents: 79
diff changeset
  1617
		    goto bad;
claus
parents: 79
diff changeset
  1618
		nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
claus
parents: 79
diff changeset
  1619
		nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
claus
parents: 79
diff changeset
  1620
		objSize = _Size(addrBytes) - nInstBytes;
claus
parents: 79
diff changeset
  1621
		cp = (char *)_InstPtr(addrBytes) + nInstBytes;
claus
parents: 79
diff changeset
  1622
		if (objSize < alen) 
claus
parents: 79
diff changeset
  1623
		    goto bad;
claus
parents: 79
diff changeset
  1624
		bcopy((char *)&sa, cp, alen);
claus
parents: 79
diff changeset
  1625
		addrLen = _MKSMALLINT(alen);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1626
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1627
	}
71
claus
parents: 63
diff changeset
  1628
	if (n < 0) {
claus
parents: 63
diff changeset
  1629
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1630
	}
81
claus
parents: 79
diff changeset
  1631
	nReceived = _MKSMALLINT(n);
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1632
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1633
bad: ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1634
%}.
81
claus
parents: 79
diff changeset
  1635
    nReceived notNil ifTrue:[
claus
parents: 79
diff changeset
  1636
	nReceived < 0 ifTrue:[
claus
parents: 79
diff changeset
  1637
	    (OperatingSystem errorTextForNumber:lastErrorNumber) printNL.
claus
parents: 79
diff changeset
  1638
	].
claus
parents: 79
diff changeset
  1639
	addrLen notNil ifTrue:[
claus
parents: 79
diff changeset
  1640
	    anAddressBuffer class isBytes ifTrue:[
claus
parents: 79
diff changeset
  1641
		anAddressBuffer replaceFrom:1 to:addrLen with:addrBytes
claus
parents: 79
diff changeset
  1642
	    ] ifFalse:[
claus
parents: 79
diff changeset
  1643
		"/ can be SocketAddress for ST-80 compatibility
claus
parents: 79
diff changeset
  1644
		anAddressBuffer addressBytes:(addrBytes copyTo:addrLen)
claus
parents: 79
diff changeset
  1645
	    ].
claus
parents: 79
diff changeset
  1646
	].
claus
parents: 79
diff changeset
  1647
	^ nReceived
claus
parents: 79
diff changeset
  1648
    ].
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1649
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1650
     arrive here if you try to receive into an invalid buffer
71
claus
parents: 63
diff changeset
  1651
     (i.e. not ByteArray-like), 
claus
parents: 63
diff changeset
  1652
     or if the addressBuffer is nonNil AND not a ByteArray/String 
claus
parents: 63
diff changeset
  1653
     or if the addressBuffer is nonNil AND too small.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1654
    "
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1655
    self primitiveFailed
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1656
!
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1657
81
claus
parents: 79
diff changeset
  1658
receiveFrom:anAddressBuffer buffer:aDataBuffer
claus
parents: 79
diff changeset
  1659
    "receive datagramm data - put address of originating host into
claus
parents: 79
diff changeset
  1660
     anAddressBuffer, data into aBuffer. 
claus
parents: 79
diff changeset
  1661
     Both must be ByteArray-like. The addressBuffer must
claus
parents: 79
diff changeset
  1662
     provide space for a valid address for my domain (i.e. for inet, a 4-byte byteArray).
claus
parents: 79
diff changeset
  1663
     Return the number of bytes received, or a negative number on error.
claus
parents: 79
diff changeset
  1664
     On error, the unix error code is left in the lastErrorNumber
claus
parents: 79
diff changeset
  1665
     instance variable."
claus
parents: 79
diff changeset
  1666
claus
parents: 79
diff changeset
  1667
    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:1 for:(aDataBuffer size)
claus
parents: 79
diff changeset
  1668
!
claus
parents: 79
diff changeset
  1669
claus
parents: 79
diff changeset
  1670
sendTo:anAddressBuffer buffer:buffer
71
claus
parents: 63
diff changeset
  1671
    "send datagramm data - fetch address of destination host from
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1672
     anAddressBuffer, data from aDataBuffer. 
71
claus
parents: 63
diff changeset
  1673
     Both must be ByteArray-like. The bytes in the addressBuffer must
claus
parents: 63
diff changeset
  1674
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
claus
parents: 63
diff changeset
  1675
     Return the number of bytes transmitted, or a negative number on error.
claus
parents: 63
diff changeset
  1676
     On error, the unix error code is left in the lastErrorNumber
81
claus
parents: 79
diff changeset
  1677
     instance variable.
claus
parents: 79
diff changeset
  1678
     Flags is currently ignored; it is there for ST-80 compatibility."
claus
parents: 79
diff changeset
  1679
claus
parents: 79
diff changeset
  1680
    ^ self sendTo:anAddressBuffer buffer:buffer start:1 for:buffer size flags:0 
claus
parents: 79
diff changeset
  1681
!
claus
parents: 79
diff changeset
  1682
claus
parents: 79
diff changeset
  1683
sendTo:anAddressBuffer buffer:aDataBuffer start:startIndex for:count flags:flags
claus
parents: 79
diff changeset
  1684
    "send datagramm data - fetch address of destination host from
claus
parents: 79
diff changeset
  1685
     anAddressBuffer, data from aDataBuffer starting at startIndex,
claus
parents: 79
diff changeset
  1686
     sending count bytes. 
claus
parents: 79
diff changeset
  1687
     Both must be ByteArray-like. The bytes in the addressBuffer must
claus
parents: 79
diff changeset
  1688
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
claus
parents: 79
diff changeset
  1689
     Return the number of bytes transmitted, or a negative number on error.
claus
parents: 79
diff changeset
  1690
     On error, the unix error code is left in the lastErrorNumber
71
claus
parents: 63
diff changeset
  1691
     instance variable."
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1692
82
claus
parents: 81
diff changeset
  1693
    |addrBytes addrLen nReceived portNo|
81
claus
parents: 79
diff changeset
  1694
82
claus
parents: 81
diff changeset
  1695
    "/ addressBuffer can be a 6-byte byteArray (last 2 bytes are portNo, msb-first)
claus
parents: 81
diff changeset
  1696
    "/ or an instance of IPSocketAddress
claus
parents: 81
diff changeset
  1697
    "/
claus
parents: 81
diff changeset
  1698
    anAddressBuffer class isBytes ifTrue:[
claus
parents: 81
diff changeset
  1699
	addrBytes := anAddressBuffer copyFrom:1 to:4.
claus
parents: 81
diff changeset
  1700
	portNo := ((anAddressBuffer at:5) bitShift:8)
claus
parents: 81
diff changeset
  1701
		  + (anAddressBuffer at:6).
claus
parents: 81
diff changeset
  1702
    ] ifFalse:[
claus
parents: 81
diff changeset
  1703
	addrBytes := anAddressBuffer hostAddress.
claus
parents: 81
diff changeset
  1704
	portNo := anAddressBuffer port.
81
claus
parents: 79
diff changeset
  1705
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1706
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1707
    OBJ oClass;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1708
    OBJ fp = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1709
    int nInstVars, nInstBytes, objSize;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1710
    int sock;
81
claus
parents: 79
diff changeset
  1711
    struct sockaddr_in sa;
claus
parents: 79
diff changeset
  1712
    struct sockaddr *saPtr = (struct sockaddr *)&sa;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1713
    int alen = sizeof(sa);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1714
    int n;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1715
    char *cp;
81
claus
parents: 79
diff changeset
  1716
    int _flags = 0;
claus
parents: 79
diff changeset
  1717
    int offs, nBytes;
83
claus
parents: 82
diff changeset
  1718
    unsigned long norder;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1719
81
claus
parents: 79
diff changeset
  1720
    _flags = __longIntVal(flags);
claus
parents: 79
diff changeset
  1721
 
claus
parents: 79
diff changeset
  1722
    if ((fp != nil) 
claus
parents: 79
diff changeset
  1723
     && __isSmallInteger(startIndex)
claus
parents: 79
diff changeset
  1724
     && __isSmallInteger(count)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1725
	sock = fileno((FILE *)(_intVal(fp)));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1726
81
claus
parents: 79
diff changeset
  1727
	if (addrBytes != nil) {
82
claus
parents: 81
diff changeset
  1728
	    if (! __isByteArray(addrBytes)) goto bad;
claus
parents: 81
diff changeset
  1729
	    cp = __ByteArrayInstPtr(addrBytes)->ba_element;
claus
parents: 81
diff changeset
  1730
	    n = __byteArraySize(addrBytes);
claus
parents: 81
diff changeset
  1731
	    if (alen < n) n = alen;
claus
parents: 81
diff changeset
  1732
/*
claus
parents: 81
diff changeset
  1733
printf("address is %d bytes ... %d.%d.%d.%d", n, cp[0], cp[1], cp[2], cp[3]);
claus
parents: 81
diff changeset
  1734
*/
claus
parents: 81
diff changeset
  1735
	    bcopy(cp, &sa.sin_addr.s_addr, n);
claus
parents: 81
diff changeset
  1736
	    sa.sin_family = AF_INET;
claus
parents: 81
diff changeset
  1737
	    sa.sin_port = htons((u_short) __intVal(portNo)); 
81
claus
parents: 79
diff changeset
  1738
	} else {
claus
parents: 79
diff changeset
  1739
	    alen = 0;
claus
parents: 79
diff changeset
  1740
	    saPtr = (struct sockaddr *)0;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1741
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1742
71
claus
parents: 63
diff changeset
  1743
	oClass = __Class(aDataBuffer);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1744
	switch (_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1745
	    case BYTEARRAY:
81
claus
parents: 79
diff changeset
  1746
		offs = __intVal(startIndex) - 1;
claus
parents: 79
diff changeset
  1747
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1748
	    case WORDARRAY:
81
claus
parents: 79
diff changeset
  1749
		offs = (__intVal(startIndex) - 1) * sizeof(short);
claus
parents: 79
diff changeset
  1750
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1751
	    case LONGARRAY:
81
claus
parents: 79
diff changeset
  1752
		offs = (__intVal(startIndex) - 1) * sizeof(long);
claus
parents: 79
diff changeset
  1753
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1754
	    case FLOATARRAY:
81
claus
parents: 79
diff changeset
  1755
		offs = (__intVal(startIndex) - 1) * sizeof(float);
claus
parents: 79
diff changeset
  1756
		break;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1757
	    case DOUBLEARRAY:
81
claus
parents: 79
diff changeset
  1758
		offs = (__intVal(startIndex) - 1) * sizeof(double);
claus
parents: 79
diff changeset
  1759
#ifdef NEED_DOUBLE_ALIGN
claus
parents: 79
diff changeset
  1760
		offs += sizeof(long);
claus
parents: 79
diff changeset
  1761
#endif
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1762
		break;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1763
	    default:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1764
		goto bad;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1765
	}
81
claus
parents: 79
diff changeset
  1766
	nBytes = __intVal(count);
claus
parents: 79
diff changeset
  1767
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1768
	nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1769
	nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
81
claus
parents: 79
diff changeset
  1770
	objSize = __qSize(aDataBuffer) - nInstBytes;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1771
	cp = (char *)_InstPtr(aDataBuffer) + nInstBytes;
81
claus
parents: 79
diff changeset
  1772
	cp += offs;
claus
parents: 79
diff changeset
  1773
	if ((offs + nBytes) > objSize) {
82
claus
parents: 81
diff changeset
  1774
/*
81
claus
parents: 79
diff changeset
  1775
printf("cut off ...\n");
82
claus
parents: 81
diff changeset
  1776
*/
81
claus
parents: 79
diff changeset
  1777
	    nBytes = objSize - offs;
claus
parents: 79
diff changeset
  1778
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1779
82
claus
parents: 81
diff changeset
  1780
	norder = htonl(sa.sin_addr.s_addr);
claus
parents: 81
diff changeset
  1781
/*
claus
parents: 81
diff changeset
  1782
printf("sending %d bytes ... to ", nBytes);
claus
parents: 81
diff changeset
  1783
printf("%d.%d.%d.%d\n",
claus
parents: 81
diff changeset
  1784
		    (norder >> 24) & 0xFF,
claus
parents: 81
diff changeset
  1785
		    (norder >> 16) & 0xFF,
claus
parents: 81
diff changeset
  1786
		    (norder >> 8) & 0xFF,
claus
parents: 81
diff changeset
  1787
		    norder & 0xFF);
claus
parents: 81
diff changeset
  1788
*/
claus
parents: 81
diff changeset
  1789
81
claus
parents: 79
diff changeset
  1790
	__BEGIN_INTERRUPTABLE__
claus
parents: 79
diff changeset
  1791
	do {
claus
parents: 79
diff changeset
  1792
	    n = sendto(sock, cp, nBytes, _flags, saPtr, alen);
claus
parents: 79
diff changeset
  1793
	} while ((n < 0) && (errno == EINTR));
claus
parents: 79
diff changeset
  1794
	__END_INTERRUPTABLE__
claus
parents: 79
diff changeset
  1795
71
claus
parents: 63
diff changeset
  1796
	if (n < 0) {
claus
parents: 63
diff changeset
  1797
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1798
	}
71
claus
parents: 63
diff changeset
  1799
	RETURN (_MKSMALLINT(n));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1800
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1801
bad: ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1802
%}.
71
claus
parents: 63
diff changeset
  1803
    "
claus
parents: 63
diff changeset
  1804
     arrive here if you try to send from an invalid buffer
claus
parents: 63
diff changeset
  1805
     (i.e. not ByteArray-like), 
claus
parents: 63
diff changeset
  1806
     or if the addressBuffer is nonNil AND not a ByteArray/String 
claus
parents: 63
diff changeset
  1807
     or if the addressBuffer is nonNil AND too small.
claus
parents: 63
diff changeset
  1808
    "
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1809
    self primitiveFailed
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1810
! !