Socket.st
author claus
Sat, 18 Feb 1995 19:31:33 +0100
changeset 63 7dd3d5b7877e
parent 58 bd6753bf0401
child 71 632e2cc151c9
permissions -rw-r--r--
*** empty log message ***
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
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
    14
       instanceVariableNames:'domain socketType protocol portNr 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
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    25
$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.18 1995-02-18 18:31:19 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
"
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    46
$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.18 1995-02-18 18:31:19 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
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    60
    still provided. This will vanish; use the newTCPxxx and newUDPxxx interface,
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    61
    which is meant to be compatible to ST-80's UnixSocketAccessor interface.
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    62
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    63
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    64
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    65
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
    66
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    67
    example (get help info from an nntp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    68
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    69
	|sock|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    70
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    71
	sock := Socket 
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    72
		    newTCPclientToHost:(OperatingSystem 
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    73
					    getEnvironment:'NNTPSERVER') 
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    74
				  port:'nntp'.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    75
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    76
	sock buffered:false.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    77
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    78
	sock nextPutAll:'HELP'; cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    79
	[:exit |
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    80
	    |line|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    81
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    82
	    line := sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    83
	    line = '.' ifTrue:[exit value:nil].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    84
	    Transcript showCr:line.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    85
	] loopWithExit.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    86
	sock close
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    87
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    88
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    89
    example (connect to an ftp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    90
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    91
	|sock|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    92
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    93
	sock := Socket 
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    94
		    newTCPclientToHost:(OperatingSystem getHostName) 
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    95
				  port:'ftp'.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
    96
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    97
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    98
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
    99
	sock nextPutAll:('USER ' , OperatingSystem getLoginName); cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   100
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   101
	sock nextPutAll:('PASS ' , 'fooBar'); cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   102
	Transcript showCr:sock nextLine.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   103
	sock nextPutAll:'LIST'; cr.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   104
	Transcript showCr:sock nextLine.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   105
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   106
	'dont know enough of the ftp protocol to continue here ...'
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   107
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   108
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   109
    example (connect to an snmp server):
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   110
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   111
	|sock|
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   112
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   113
	sock := Socket newUDP:'snpm'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   114
	sock connectTo:(OperatingSystem getHostName).
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   115
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   116
	Transcript showCr:got it'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   117
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   118
    example (await connection from a client and read some data):
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   119
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   120
	|connectSock sock|
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   121
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   122
	connectSock := Socket provide:9996.  
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   123
	Transcript showCr:'listen ..'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   124
	connectSock listenFor:5.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   125
	Transcript showCr:'wait'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   126
	connectSock readWait.  
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   127
	Transcript showCr:'accept'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   128
	sock := Socket new acceptOn:self.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   129
	Transcript showCr:'close'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   130
	connectSock close.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   131
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   132
	Transcript showCr:'server: got it'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   133
	'can now do transfer via sock'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   134
	Transcript showCr:'read'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   135
	Transcript showCr:('got: ' , sock nextLine).
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   136
	sock close
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   137
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   138
    example (connect to above server and send some data):
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   139
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   140
	|sock|
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   141
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   142
	sock := Socket connectTo:9996 on:'porty'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   143
	sock buffered:false.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   144
	Transcript showCr:'client: got it'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   145
	'can now do transfer via sock'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   146
	Transcript showCr:'sending <hello>'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   147
	sock nextPutLine:'hello'.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   148
	sock close
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   149
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   150
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   151
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   152
!Socket primitiveDefinitions!
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   153
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   154
%{
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   155
#include <stdio.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   156
#include <errno.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   157
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   158
#ifdef LINUX
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   159
/* kludge to avoid some redefines ... */
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   160
# define _ARPA_NAMESER_H
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   161
# define _NETINET_TCP_H
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   162
#endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   163
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   164
#ifndef transputer
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   165
# include <fcntl.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   166
# include <sys/types.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   167
# ifdef IRIS
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   168
   /* no socket.h on 4.0.5h ?!?!? */
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   169
#  define AF_UNIX 1
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   170
#  define AF_INET 2
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   171
#  define SOCK_STREAM 1
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   172
#  define SOCK_DGRAM  2
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   173
#  define SOCK_RAW    3
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   174
# else
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   175
#  include <sys/socket.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   176
# endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   177
# include <netdb.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   178
# include <netinet/in.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   179
# if ! (defined(SYSV3) && defined(mc88k))
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   180
#  include <netinet/tcp.h>
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   181
# endif
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   182
#endif
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   183
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   184
extern int __immediateInterrupt__;
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   185
/*
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   186
 * on some systems errno is a macro ... check for it here
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   187
 */
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   188
#ifndef errno
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   189
 extern errno;
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   190
#endif
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   191
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   192
%}
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   193
! !
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
   194
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   195
!Socket class methodsFor:'signal access'!
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   196
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   197
brokenConnectionSignal
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   198
    "return the signal used to tell broken connections.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   199
     Since in unix, this is the same as the broken pipe signal,
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   200
     return that one.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   201
     (for other Operatingsystems, this may change ..)"
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   202
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   203
    ^ PipeStream brokenPipeSignal
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   204
! !
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   205
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   206
!Socket class methodsFor:'queries'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   207
6
claus
parents: 4
diff changeset
   208
ipAddressOfHost:aHostName
claus
parents: 4
diff changeset
   209
    "return the IP (internet-) number for a hostname"
claus
parents: 4
diff changeset
   210
claus
parents: 4
diff changeset
   211
    |b1 b2 b3 b4|
claus
parents: 4
diff changeset
   212
claus
parents: 4
diff changeset
   213
%{
claus
parents: 4
diff changeset
   214
    struct sockaddr_in sa ;
claus
parents: 4
diff changeset
   215
    struct hostent *hp ;
claus
parents: 4
diff changeset
   216
    long addr;
claus
parents: 4
diff changeset
   217
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   218
    if (__isString(aHostName)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   219
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   220
	if ((addr = inet_addr((char *) _stringVal(aHostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   221
	    /* is Internet addr in octet notation */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   222
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)); 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   223
	    sa.sin_family = AF_INET;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   224
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   225
	    /* do we know the host's address? */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   226
	    if ((hp = gethostbyname((char *) _stringVal(aHostName))) == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   227
		printf("unknown host\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   228
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   229
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   230
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   231
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   232
	}
6
claus
parents: 4
diff changeset
   233
    }
claus
parents: 4
diff changeset
   234
    /* if the addressing family is not AF_INET, return nil */
claus
parents: 4
diff changeset
   235
    if (sa.sin_family != AF_INET) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   236
	RETURN ( nil );
6
claus
parents: 4
diff changeset
   237
    }
claus
parents: 4
diff changeset
   238
    b1 = _MKSMALLINT((sa.sin_addr.s_addr >> 24) & 0xFF);
claus
parents: 4
diff changeset
   239
    b2 = _MKSMALLINT((sa.sin_addr.s_addr >> 16) & 0xFF);
claus
parents: 4
diff changeset
   240
    b3 = _MKSMALLINT((sa.sin_addr.s_addr >> 8) & 0xFF);
claus
parents: 4
diff changeset
   241
    b4 = _MKSMALLINT((sa.sin_addr.s_addr >> 0) & 0xFF);
claus
parents: 4
diff changeset
   242
%}
claus
parents: 4
diff changeset
   243
.
claus
parents: 4
diff changeset
   244
    ^ ByteArray with:b1 with:b2 with:b3 with:b4
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   245
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   246
    "Socket ipAddressOfHost:'clam'"
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   247
    "Socket ipAddressOfHost:'porty'"
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   248
    "Socket ipAddressOfHost:'josef'"
6
claus
parents: 4
diff changeset
   249
!
claus
parents: 4
diff changeset
   250
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   251
hostWithIpAddress:anAddress
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   252
    "return the hostname for an IP (internet-) address"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   253
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   254
    |b1 b2 b3 b4|
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   255
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   256
    b1 := anAddress at:1.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   257
    b2 := anAddress at:2.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   258
    b3 := anAddress at:3.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   259
    b4 := anAddress at:4.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   260
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   261
    struct sockaddr_in sa ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   262
    struct hostent *hp ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   263
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   264
    if (__bothSmallInteger(b1, b2) && __bothSmallInteger(b3, b4)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   265
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   266
	sa.sin_addr.s_addr = _intVal(b1) & 0xFF;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   267
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b2) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   268
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b3) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   269
	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b4) & 0xFF);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   270
	sa.sin_family = AF_INET;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   271
	/* do we know the host's address? */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   272
	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
   273
	if (hp == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   274
	    printf("unknown address: %d.%d.%d.%d\n", _intVal(b1), _intVal(b2), _intVal(b3), _intVal(b4));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   275
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   276
	sa.sin_family = hp->h_addrtype;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   277
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   278
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   279
    /* if the addressing family is not AF_INET, return nil */
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   280
    if (sa.sin_family != AF_INET) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   281
	RETURN ( nil );
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   282
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   283
    if (hp != NULL)
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   284
	RETURN (_MKSTRING(hp->h_name COMMA_CON));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   285
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   286
    RETURN (_MKSTRING(inet_ntoa(sa.sin_addr) COMMA_CON));
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   287
%}
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   288
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   289
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   290
     Socket ipAddressOfHost:'clam'
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   291
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   292
     Socket ipAddressOfHost:'porty'
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   293
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   294
     Socket hostWithIpAddress:#[1 2 3 4]
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   295
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   296
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   297
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   298
portOfService:aNameOrNumber
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   299
    "returns the port-number for a given service
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   300
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   301
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   302
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   303
    struct servent *servent = NULL;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   304
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   305
    if (__isSmallInteger(aNameOrNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   306
	servent = getservbyport(htons(_intVal(aNameOrNumber)), "tcp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   307
	if (servent != NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   308
	    RETURN ( aNameOrNumber );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   309
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   310
	RETURN ( aNameOrNumber );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   311
    }
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   312
    if (__isString(aNameOrNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   313
	servent = getservbyname((char *) _stringVal(aNameOrNumber), "tcp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   314
	if (servent != NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   315
	    RETURN ( _MKSMALLINT(ntohs(servent->s_port)) );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   316
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   317
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   318
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   319
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   320
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   321
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   322
     Socket portOfService:'finger'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   323
     Socket portOfService:'nntp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   324
     Socket portOfService:'echo'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   325
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   326
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   327
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   328
protocolOfService:aNameOrNumber
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   329
    "returns the protocol (as string) for a given service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   330
     or nil if no such service exists."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   331
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   332
    struct servent *servent = NULL;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   333
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   334
    if (__isSmallInteger(aNameOrNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   335
	servent = getservbyport(htons(_intVal(aNameOrNumber)), "tcp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   336
	if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   337
	    servent = getservbyport(htons(_intVal(aNameOrNumber)), "udp") ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   338
	    if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   339
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   340
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   341
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   342
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   343
	if (__isString(aNameOrNumber)) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   344
	    servent = getservbyname((char *) _stringVal(aNameOrNumber), "tcp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   345
	    if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   346
		servent = getservbyname((char *) _stringVal(aNameOrNumber), "udp");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   347
		if (servent == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   348
		    RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   349
		}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   350
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   351
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   352
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   353
    if (servent) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   354
	RETURN ( _MKSTRING(servent->s_proto COMMA_CON) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   355
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   356
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   357
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   358
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   359
     Socket protocolOfService:'finger'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   360
     Socket protocolOfService:'nntp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   361
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   362
     Socket protocolOfService:79
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   363
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   364
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   365
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   366
domainOfProtocol:aProtocol
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   367
    "given a protocols name (i.e. tcp, udp etc) return the domain.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   368
     This method needs more ... - or is there a way to get this from the system ?"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   369
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   370
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   371
     tcp/ip stuff
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   372
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   373
    (aProtocol = 'tcp') ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   374
    (aProtocol = 'udp') ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   375
    (aProtocol = 'ip')  ifTrue:[^ #inet].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   376
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   377
     x25 stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   378
     appletalk stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   379
     other stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   380
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   381
    ^ nil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   382
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   383
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   384
     Socket domainOfProtocol:'tcp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   385
     Socket domainOfProtocol:'ucp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   386
     Socket domainOfProtocol:(Socket protocolOfService:'nntp')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   387
     Socket domainOfProtocol:(Socket protocolOfService:'echo')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   388
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   389
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   390
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   391
typeOfProtocol:aProtocol
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   392
    "given a protocols name (i.e. tcp, udp etc) return the connection type.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   393
     This method needs more ... - or is there a way to get this from the system ?"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   394
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   395
    (aProtocol = 'tcp') ifTrue:[^ #stream].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   396
    (aProtocol = 'udp') ifTrue:[^ #datagram].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   397
    (aProtocol = 'ip')  ifTrue:[^ #raw].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   398
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   399
     x25 stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   400
     appletalk stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   401
     other stuff (if any)
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   402
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   403
    ^ nil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   404
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   405
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   406
     Socket typeOfProtocol:'tcp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   407
     Socket typeOfProtocol:'ucp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   408
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   409
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   410
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   411
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   412
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   413
!Socket class methodsFor:'tcp/ip instance creation'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   414
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   415
connectTo:service on:host
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   416
    "standard setup: create new client tcp socket, bind and connect; 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   417
     return the socket.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   418
     The system will block (interruptable), until the connection is 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   419
     established."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   420
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   421
    ^ (self new) for:host port:(self portOfService:service).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   422
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   423
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   424
     Socket connectTo:9995 on:'clam'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   425
     Socket connectTo:'finger' on:'clam'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   426
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   427
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   428
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   429
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   430
provide:service
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   431
    "standard setup: create a new TCP server socket providing a service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   432
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   433
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   434
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   435
    newSock := (self new) for:nil port:(self portOfService:service).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   436
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   437
	newSock listenFor:5.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   438
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   439
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   440
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   441
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   442
     Socket provide:9995
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   443
     (Socket provide:9996) accept
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   444
     Socket provide:'nntp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   445
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   446
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   447
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   448
!Socket class methodsFor:'general instance creation'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   449
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   450
domain:domainSymbol type:type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   451
    "create a socket for domain and type -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   452
     neither any connect nor binding is done.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   453
     Domain must be one of the symbols: #inet, #unix, #ns, #appletalk or #ns;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   454
     Type must be #stream, #datagram or #raw
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   455
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   456
     XXX: currently only the #inet domain is supported"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   457
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   458
    ^ self new domain:domainSymbol type:type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   459
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   460
    "Socket domain:#inet type:#stream"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   461
    "Socket domain:#inet type:#datagram"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   462
    "Socket domain:#appletalk type:#stream"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   463
    "Socket domain:#DECnet type:#stream"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   464
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   465
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   466
newUDP
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   467
    "create a UDP socket - no binding or other setup is done,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   468
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   469
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   470
    ^ self new domain:#inet type:#datagram
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   471
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   472
    "Socket newUDP"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   473
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   474
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   475
newUDP:aServiceOrNil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   476
    "create a UDP socket for a service -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   477
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   478
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   479
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   480
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   481
    newSock := self newUDP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   482
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   483
	newSock bindTo:(self portOfService:aServiceOrNil) address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   484
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   485
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   486
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   487
    "Socket newUDP:nil"
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
newTCP
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   491
    "create a TCP socket - no binding or other setup is done,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   492
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   493
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   494
    ^ self new domain:#inet type:#stream 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   495
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   496
    "Socket newUDP"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   497
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   498
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   499
newTCP:aServiceOrNil
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   500
    "create a TCP socket for a service -
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   501
     neither connect nor connect-wait is done."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   502
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   503
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   504
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   505
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   506
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   507
	newSock bindTo:(self portOfService:aServiceOrNil) address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   508
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   509
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   510
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   511
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   512
    "Socket newTCP:'nntp'"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   513
    "Socket newTCP:9995"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   514
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   515
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   516
newTCPclientToHost:hostname port:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   517
    "create a new TCP client socket connecting to a service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   518
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   519
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   520
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   521
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   522
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   523
	(newSock connectTo:hostname port:(self portOfService:aService)) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   524
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   525
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   526
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   527
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   528
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   529
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   530
    ^ (self new) for:hostname port:(self portOfService:aPort).
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   531
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   532
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   533
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   534
      Socket newTCPclientToHost:'slsv6bt' port:'nntp'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   535
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   536
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   537
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   538
newTCPserverAtPort:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   539
    "create a new TCP server socket providing service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   540
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   541
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   542
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   543
    newSock := self newTCP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   544
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   545
	(newSock bindTo:(self portOfService:aService) address:nil) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   546
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   547
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   548
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   549
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   550
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   551
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   552
    ^ (self new) for:nil port:aPort
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   553
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   554
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   555
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   556
newUDPserverAtPort:aService
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   557
    "create a new UDP server socket providing service."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   558
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   559
    |newSock|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   560
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   561
    newSock := self newUDP.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   562
    newSock notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   563
	(newSock bindTo:(self portOfService:aService) address:nil) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   564
	    ^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   565
	]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   566
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   567
    ^ newSock
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   568
"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   569
same as:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   570
    ^ (self new) for:nil udpPort:aPort
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   571
"
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   572
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   573
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   574
!Socket methodsFor:'socket setup'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   575
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   576
domain:domainArg type:typeArg
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   577
    "set up socket with domain, type.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   578
     This is a low level entry; no binding, listening or connect
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   579
     is done."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   580
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   581
    |errorNr|
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   582
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   583
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   584
	^ self error:'already created'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   585
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   586
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   587
    FILE *fp;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   588
    int dom, typ, proto, sock;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   589
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   590
    if (! __isSymbol(domainArg)) { 
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   591
	fprintf(stderr, "bad domain\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   592
	RETURN ( nil );
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   593
    }
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   594
    if (! __isSymbol(typeArg)) { 
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   595
	fprintf(stderr, "bad type\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   596
	RETURN ( nil );
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   597
    }
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   598
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   599
    /*
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   600
     * get address-family
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   601
     */
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   602
#ifdef AF_UNIX
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   603
    if (domainArg == @symbol(unix))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   604
	dom = AF_UNIX;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   605
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   606
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   607
#ifdef AF_INET
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   608
    if (domainArg == @symbol(inet))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   609
	dom = AF_INET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   610
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   611
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   612
#ifdef AF_NS
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   613
    if (domainArg == @symbol(ns))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   614
	dom = AF_NS;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   615
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   616
#endif
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   617
#ifdef AF_DECnet
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   618
    if (domainArg == @symbol(DECnet))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   619
	dom = AF_DECnet;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   620
    else
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   621
#endif
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   622
#ifdef AF_APPLETALK
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   623
    if (domainArg == @symbol(appletalk))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   624
	dom = AF_APPLETALK;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   625
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   626
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   627
#ifdef AF_X25
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   628
    if (domainArg == @symbol(x25))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   629
	dom = AF_X25;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   630
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   631
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   632
    {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   633
	fprintf(stderr, "unknown domain <%s>\n", _stringVal(domainArg));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   634
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   635
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   636
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   637
#ifdef SOCK_STREAM
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   638
    if (typeArg == @symbol(stream))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   639
	typ = SOCK_STREAM;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   640
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   641
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   642
#ifdef SOCK_DGRAM
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   643
    if (typeArg == @symbol(datagram))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   644
	typ = SOCK_DGRAM;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   645
    else 
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   646
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   647
#ifdef SOCK_RAW
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   648
    if (typeArg == @symbol(raw))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   649
	typ = SOCK_RAW;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   650
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   651
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   652
#ifdef SOCK_SEQPACKET
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   653
    if (typeArg == @symbol(seqPacket))
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   654
	typ = SOCK_SEQPACKET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   655
    else
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   656
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   657
    {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   658
	fprintf(stderr, "bad type <%s>\n", _stringVal(typeArg));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   659
	RETURN ( nil );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   660
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   661
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   662
    __immediateInterrupt__ = 1;
6
claus
parents: 4
diff changeset
   663
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   664
	sock = socket(dom, typ, 0);
6
claus
parents: 4
diff changeset
   665
    } while ((sock < 0) && (errno == EINTR));
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   666
    __immediateInterrupt__ = 0;
6
claus
parents: 4
diff changeset
   667
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   668
    if (sock < 0) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   669
	fprintf(stderr, "socket failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   670
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   671
    } else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   672
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   673
	 * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   674
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   675
	fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   676
	if (! fp) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   677
	    fprintf(stderr, "fdopen failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   678
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   679
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   680
	    _INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   681
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   682
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   683
%}
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   684
.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   685
    "all ok?"
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   686
    filePointer notNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   687
	domain := domainArg.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   688
	socketType := typeArg.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   689
    ] ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   690
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   691
    ].
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   692
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   693
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   694
     Socket new domain:#inet type:#stream
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   695
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   696
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   697
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   698
for:hostName udpPort:portNr
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   699
    "setup for a UDP socket (i.e. inet domain, datagram type) 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   700
     if hostname is nil, a server port is opened;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   701
     otherwise a client port to the server on host.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   702
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   703
     HISTORIC LEFTOVER:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   704
     This method will vanish, as soon as the low level
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   705
     connect/bind works,"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   706
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   707
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   708
	^ self error:'already created'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   709
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   710
    (portNr isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   711
	^ self error:'invalid portNr'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   712
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   713
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   714
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   715
    struct hostent *hp ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   716
    int a, sock ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   717
    long addr;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   718
    FILE *fp;
6
claus
parents: 4
diff changeset
   719
    int ret;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   720
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   721
    if (hostName != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   722
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   723
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   724
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   725
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   726
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   727
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   728
	    sa.sin_family = AF_INET ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   729
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   730
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   731
	     * is hostname - 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   732
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   733
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   734
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   735
		printf("unknown host\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   736
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   737
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   738
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   739
	    sa.sin_family = hp->h_addrtype ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   740
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   741
    } else
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   742
	sa.sin_family = AF_INET;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   743
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   744
    /*
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   745
     * create the socket
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   746
     */
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   747
    __immediateInterrupt__ = 1;
6
claus
parents: 4
diff changeset
   748
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   749
	sock = socket(sa.sin_family, SOCK_DGRAM, 0);
6
claus
parents: 4
diff changeset
   750
    } while ((sock < 0) && (errno == EINTR));
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   751
    if (sock < 0) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   752
	fprintf(stderr, "socket failed\n");
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   753
	__immediateInterrupt__ = 0;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   754
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   755
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   756
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   757
	 * ok,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   758
	 * connect/bind 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   759
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   760
	if (hostName == nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   761
	    sa.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   762
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   763
		ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   764
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   765
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   766
	    sa.sin_port = htons((u_short) _intVal(portNr)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   767
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   768
		ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   769
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   770
	}
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   771
	__immediateInterrupt__ = 0;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   772
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   773
	if (ret < 0) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   774
	    fprintf(stderr, "bind/connect failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   775
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   776
	    close(sock) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   777
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   778
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   779
	     * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   780
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   781
	    fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   782
	    if (! fp) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   783
		fprintf(stderr, "fdopen failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   784
		_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   785
		close(sock);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   786
	    } else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   787
/*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   788
		setbuf(fp, NULL);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   789
 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   790
		_INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   791
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   792
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   793
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   794
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   795
    filePointer isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   796
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   797
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   798
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   799
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   800
    buffered := false.
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   801
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   802
    mode := #readwrite.
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   803
    binary := false.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   804
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   805
    domain := #inet.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   806
    socketType := #datagram.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   807
    protocol := portNr.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   808
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   809
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   810
     Socket new for:'clam' udpPort:(Socket portOfService:'echo')
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   811
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   812
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   813
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   814
for:hostName port:portNr
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   815
    "setup for a TCP socket (i.e. inet domain, stream type) 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   816
     If hostname is nil, a server port is opened,
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   817
     otherwise a client port to the server on host.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   818
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   819
     HISTORIC LEFTOVER:
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   820
     This method will vanish, as soon as the low level
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   821
     connect/bind works,"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   822
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   823
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   824
	^ self error:'already created'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   825
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   826
    (portNr isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   827
	^ self error:'invalid portNr'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   828
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   829
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   830
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   831
    struct hostent *hp ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   832
    int a, sock ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   833
    long addr;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   834
    FILE *fp;
6
claus
parents: 4
diff changeset
   835
    int ret;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   836
    int on = 1;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   837
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   838
    bzero((char *) &sa, sizeof(sa)) ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   839
    sa.sin_family = AF_INET;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   840
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   841
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   842
    if ((hostName != nil) && __isString(hostName)){
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   843
	bzero(&sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   844
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   845
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   846
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   847
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   848
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   849
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   850
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   851
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   852
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   853
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   854
		fprintf(stderr, "unknown host\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   855
		RETURN ( nil );
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   856
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   857
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   858
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   859
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   860
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   861
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   862
    /*
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   863
     * create the socket
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   864
     */
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   865
    __immediateInterrupt__ = 1;
6
claus
parents: 4
diff changeset
   866
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   867
	sock = socket(sa.sin_family, SOCK_STREAM, 0);
6
claus
parents: 4
diff changeset
   868
    } while ((sock < 0) && (errno == EINTR));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   869
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   870
    if (sock < 0) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   871
	fprintf(stderr, "socket failed\n");
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   872
	__immediateInterrupt__ = 0;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   873
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   874
    } else {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   875
	/* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   876
	 * connect/bind 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   877
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   878
	sa.sin_port = htons((u_short) _intVal(portNr)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   879
	if (hostName != nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   880
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   881
		ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   882
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   883
	} else {
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   884
#ifdef SO_REUSEADDR
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   885
	    /*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   886
	     * should I also do this for DGRAM sockets ?
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   887
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   888
	    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   889
		printf("setsockopt - SO_REUSEADDR failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   890
	    }
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   891
#endif /* SO_REUSEADDR */
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   892
	    sa.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   893
	    do {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   894
		ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   895
	    } while ((ret < 0) && (errno == EINTR));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   896
	}
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
   897
	__immediateInterrupt__ = 0;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   898
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   899
	if (ret < 0) { 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   900
	    fprintf(stderr, "bind/connect failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   901
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   902
	    close(sock) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   903
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   904
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   905
	     * make it a FILE * 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   906
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   907
	    fp = fdopen(sock, "r+");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   908
	    if (! fp) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   909
		fprintf(stderr, "fdopen failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   910
		_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   911
		close(sock);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   912
	    } else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   913
/*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   914
		setbuf(fp, NULL);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   915
*/
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   916
		_INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   917
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   918
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   919
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   920
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   921
    filePointer isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   922
	^ nil
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   923
    ].
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   924
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   925
    buffered := false.
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   926
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   927
    mode := #readwrite.
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   928
    binary := false.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   929
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   930
    domain := #inet.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   931
    socketType := #stream.
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
   932
    protocol := portNr.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   933
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   934
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   935
     Socket new for:'clam' port:(Socket portOfService:'echo')
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   936
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   937
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   938
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   939
!Socket methodsFor:'low level'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   940
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   941
closeFile
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   942
    "low level close"
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   943
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   944
%{  /* NOCONTEXT */
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   945
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   946
    OBJ t;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   947
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   948
    t = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   949
    if (t != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   950
	FILE *fp;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   951
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   952
	fp = MKFD(t);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   953
	fflush(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   954
	shutdown(fileno(fp), 2);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   955
	fclose(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   956
	_INST(filePointer) = nil;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   957
    }
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   958
%}
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   959
!
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
   960
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   961
bindTo:portNumber address:address
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   962
    "low level bind - returns true if ok, false otherwise.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   963
     (currently only non-address binding is supported; i.e. address
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   964
      must be nil)"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   965
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   966
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   967
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   968
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   969
%{
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   970
    OBJ t = _INST(filePointer);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   971
    int sock;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   972
    struct sockaddr_in insock;
6
claus
parents: 4
diff changeset
   973
    int ret;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   974
    int on = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   975
    int ok;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   976
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   977
    if (!__isString(_INST(domain)) && !__isSymbol(_INST(domain))) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   978
	fprintf(stderr, "invalid domain\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   979
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   980
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   981
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   982
    ok = 0;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   983
#ifdef AF_INET
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   984
    if (_INST(domain) == @symbol(inet)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   985
	/*
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   986
	 * INET addresses - port must be a smallinteger
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   987
	 */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   988
	insock.sin_family = AF_INET;
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
   989
	if (! __isSmallInteger(portNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   990
	    fprintf(stderr, "invalid port\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   991
	    RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   992
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   993
	insock.sin_port = htons(_intVal(portNumber));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   994
	if (address == nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   995
	    insock.sin_addr.s_addr = htonl(INADDR_ANY);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   996
	    ok = 1;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   997
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   998
	    fprintf(stderr, "address bind not supported\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   999
	    RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1000
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1001
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1002
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1003
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1004
     * XXXX add addressing stuff for other domains here ...
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1005
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1006
#ifdef AF_UNIX
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1007
    if (_INST(domain) == @symbol(unix)) {
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1008
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1009
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1010
#ifdef AF_X25
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1011
    if (_INST(domain) == @symbol(x25)) {
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1012
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1013
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1014
#ifdef AF_NS
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1015
    if (_INST(domain) == @symbol(ns)) {
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1016
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1017
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1018
#ifdef AF_APPLETALK
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1019
    if (_INST(domain) == @symbol(appletalk)) {
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1020
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1021
#endif
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1022
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1023
    if (! ok) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1024
	fprintf(stderr, "unsupported domain\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1025
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1026
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1027
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1028
    sock = fileno(MKFD(t));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1029
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1030
#ifdef SO_REUSEADDR
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1031
    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1032
	fprintf(stderr, "setsockopt - SO_REUSEADDR failed\n");
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1033
    }
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1034
#endif /* SO_REUSEADDR */
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1035
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1036
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1037
	ret = bind(sock, (struct sockaddr *)&insock, sizeof(insock));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1038
    } while ((ret < 0) && (errno == EINTR));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1039
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1040
    if (ret < 0) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1041
	fprintf(stderr, "bind failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1042
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1043
	RETURN (false);
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1044
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1045
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1046
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1047
    portNr := portNumber.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1048
    ^ true
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1049
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1050
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1051
     (Socket domain:#inet type:#stream)
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1052
	 bindTo:9999
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1053
	 address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1054
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1055
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1056
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1057
connectTo:hostName port:aPortNr
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1058
    "low level connect; connect to port, aPortNr on host, hostName.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1059
     Return true if ok, false otherwise."
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1060
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1061
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1062
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1063
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1064
%{
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1065
    OBJ t = _INST(filePointer);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1066
    struct sockaddr_in sa ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1067
    struct hostent *hp ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1068
    int a, sock ;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1069
    long addr;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1070
    FILE *fp;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1071
    int ret;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1072
    int on = 1;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1073
    int ok;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1074
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1075
    if (! __isString(hostName)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1076
	fprintf(stderr, "invalid hostname\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1077
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1078
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1079
    if (!__isString(_INST(domain)) && !__isSymbol(_INST(domain))) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1080
	fprintf(stderr, "invalid domain\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1081
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1082
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1083
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1084
    ok = 0;
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1085
#ifdef AF_INET
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1086
    if (_INST(domain) == @symbol(inet)) {
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1087
	if (! __isSmallInteger(aPortNr)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1088
	    fprintf(stderr, "invalid port\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1089
	    RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1090
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1091
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1092
	bzero((char *) &sa, sizeof(sa)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1093
	sa.sin_family = AF_INET;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1094
	sa.sin_port = htons((u_short) _intVal(aPortNr)) ;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1095
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1096
	if ((addr = inet_addr((char *) _stringVal(hostName))) != -1) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1097
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1098
	     * is Internet addr in octet notation 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1099
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1100
	    bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1101
	    ok = 1;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1102
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1103
	    /* 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1104
	     * do we know the host's address? 
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1105
	     */
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1106
	    if ((hp = gethostbyname((char *) _stringVal(hostName))) == NULL) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1107
		fprintf(stderr, "unknown host:%s\n", _stringVal(hostName));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1108
		RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1109
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1110
	    bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1111
	    sa.sin_family = hp->h_addrtype;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1112
	    ok = 1;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1113
	}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1114
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1115
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1116
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1117
     * XXXX add addressing stuff for other domains here ...
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1118
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1119
#ifdef AF_UNIX
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1120
    if (_INST(domain) == @symbol(unix)) {
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1121
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1122
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1123
#ifdef AF_X25
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1124
    if (_INST(domain) == @symbol(x25)) {
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1125
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1126
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1127
#ifdef AF_NS
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1128
    if (_INST(domain) == @symbol(ns)) {
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_APPLETALK
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1132
    if (_INST(domain) == @symbol(appletalk)) {
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
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1136
    if (! ok) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1137
	fprintf(stderr, "unsupported domain\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1138
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1139
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1140
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1141
    sock = fileno(MKFD(t));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1142
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1143
    /* 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1144
     * connect 
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1145
     */
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
  1146
    __immediateInterrupt__ = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1147
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1148
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1149
	ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1150
    } while ((ret < 0) && (errno == EINTR));
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
  1151
    __immediateInterrupt__ = 0;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1152
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1153
    if (ret < 0) { 
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1154
	fprintf(stderr, "connect failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1155
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1156
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1157
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1158
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1159
    portNr := aPortNr.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1160
    ^ true
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1161
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1162
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1163
listenWithBacklog:aNumber
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1164
    "start listening; return true if ok, false on error"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1165
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1166
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1167
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1168
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1169
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1170
    OBJ fp = _INST(filePointer);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1171
    int sock;
6
claus
parents: 4
diff changeset
  1172
    int ret;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1173
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1174
    if (! __isSmallInteger(aNumber)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1175
	fprintf(stderr, "invalid arg\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1176
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1177
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1178
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1179
    sock = fileno(MKFD(fp));
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1180
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
  1181
    __immediateInterrupt__ = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1182
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1183
	ret = listen(sock, _intVal(aNumber));
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1184
    } while ((ret < 0) && (errno == EINTR));
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
  1185
    __immediateInterrupt__ = 0;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1186
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1187
    if (ret < 0) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1188
	fprintf(stderr, "listen failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1189
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1190
	RETURN (false);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1191
    }
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1192
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1193
    ^ true
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1194
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1195
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1196
listenFor:aNumber
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1197
    "same as listenWithBacklog: - for ST-80 compatibility"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1198
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1199
    ^ self listenWithBacklog:aNumber
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1200
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1201
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1202
acceptOn:aSocket
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1203
    "accept a connection on a server port (created with:'Socket>>onIPPort:')
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1204
     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1205
     Return the true if ok; false if not.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1206
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1207
     NOTICE: this method will block, if no connection is already pending.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1208
	     use readWait or Socket>>accept."
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1209
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1210
    |serverSocketFd|
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1211
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1212
    filePointer notNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1213
	^ self error:'already connected'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1214
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1215
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1216
    domain := aSocket domain.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1217
    socketType := aSocket type.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1218
    serverSocketFd := aSocket fileDescriptor.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1219
    serverSocketFd isNil ifTrue:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1220
	^ self error:'invalid server socket'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1221
    ].
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1222
    (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1223
	^ self error:'invalid server socket'
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1224
    ].
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1225
%{
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1226
    FILE *fp;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1227
    int flags;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1228
    int sock, newSock;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1229
    struct sockaddr_in sa ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1230
    int alen;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1231
    struct hostent *he ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1232
    long norder ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1233
    char dotted[20] ;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1234
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1235
    alen = sizeof(sa) ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1236
    sock = _intVal(serverSocketFd);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1237
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1238
    flags = ioctl(sock, F_GETFL, 0);
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1239
    ioctl(sock, F_SETFL, flags | O_NDELAY);
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
  1240
    __immediateInterrupt__ = 1;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1241
    do {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1242
	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1243
    } while ((newSock < 0) && (errno == EINTR));
51
24f978f1d849 *** empty log message ***
claus
parents: 48
diff changeset
  1244
    __immediateInterrupt__ = 0;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1245
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1246
    if (newSock < 0) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1247
	fprintf(stderr, "accept failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1248
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1249
	RETURN (false);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1250
    }
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1251
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1252
    /*
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1253
     * extract the partners address
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1254
     */
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1255
#ifdef AF_INET
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1256
    if (_INST(domain) == @symbol(inet)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1257
	he = gethostbyaddr((char *) &sa.sin_addr.s_addr, alen, AF_INET) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1258
	if (! he) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1259
	    norder = htonl(sa.sin_addr.s_addr) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1260
	    sprintf(dotted, "%d.%d.%d.%d",
36
d046fe84ea67 *** empty log message ***
claus
parents: 31
diff changeset
  1261
# if defined(SYSV3) || defined(LINUX) || defined(IRIS) || defined(IRIX5)
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1262
		    (norder >> 24) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1263
		    (norder >> 16) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1264
		    (norder >> 8) & 0xFF,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1265
		    norder & 0xFF);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1266
# else
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1267
		    sa.sin_addr.s_net, sa.sin_addr.s_host,
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1268
		    sa.sin_addr.s_lh, sa.sin_addr.s_impno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1269
# endif
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1270
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1271
	fprintf(stderr, "accepted connection from host %s\n", (he ? he->h_name : dotted)) ;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1272
	_INST(peerName) = _MKSTRING((he ? he->h_name : dotted) COMMA_CON);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1273
    }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1274
#endif
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1275
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1276
    /* 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1277
     * make it a FILE * 
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1278
     */
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1279
    fp = fdopen(newSock, "r+");
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1280
    if (! fp) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1281
	fprintf(stderr, "fdopen failed\n");
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1282
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1283
	close(newSock);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1284
	RETURN (false);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1285
    } else {
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1286
/*
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1287
	setbuf(fp, NULL);
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1288
*/
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1289
	_INST(filePointer) = MKOBJ(fp);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1290
    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1291
%}.
8
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1292
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1293
    buffered := false.
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1294
"
8c365abe1ffe *** empty log message ***
claus
parents: 6
diff changeset
  1295
    mode := #readwrite.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1296
    binary := false.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1297
    portNr := aSocket portNumber.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1298
    ^ true
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1299
!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1300
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1301
accept
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1302
    "create a new TCP socket from accepting on the receiver.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1303
     This method will suspend the current process if no connection is waiting.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1304
     For ST-80 compatibility"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1305
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1306
    |newSock|
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1307
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1308
    self readWait.  
44
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1309
    newSock := self class new.
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1310
    (newSock acceptOn:self) ifFalse:[^ nil].
b4db396f9255 EINTR stuff
claus
parents: 42
diff changeset
  1311
    ^ newSock
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1312
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1313
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1314
     |sock newSock|
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1315
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1316
     sock := Socket provide:8004.
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1317
     sock listenFor:5.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1318
     newSock := sock accept.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1319
    "
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1320
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1321
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1322
!Socket methodsFor:'queries'!
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1323
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1324
getPeerName
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1325
    "return the peer name; thats the hostname (or dotted name) of the
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1326
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1327
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1328
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1329
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1330
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1331
portNumber
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1332
    "return the port number to which the socket is bound"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1333
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1334
    ^ portNr
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1335
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1336
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1337
domain
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1338
    "return the sockets addressing domain (i.e. #inet, #x25, #appletalk)"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1339
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1340
    ^ domain
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1341
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1342
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1343
type
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1344
    "return the sockets connection type (i.e. #datagram, #stream etc)"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1345
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1346
    ^ socketType
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1347
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1348
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1349
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1350
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1351
sendTimeout:seconds
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1352
    "set the send timeout - for special applications only"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1353
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1354
    |millis|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1355
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1356
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1357
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1358
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1359
    millis := (seconds * 1000) rounded.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1360
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1361
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET) && defined(HZ)
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1362
    if (__isSmallInteger(millis)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1363
	OBJ fp = _INST(filePointer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1364
	int sock;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1365
	int opt;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1366
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1367
	sock = fileno(MKFD(fp));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1368
	opt = _intVal(millis) / (1000 / HZ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1369
	setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&opt, sizeof(int));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1370
	RETURN(true);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1371
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1372
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1373
%}
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1374
.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1375
    ^ false
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1376
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1377
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1378
receiveTimeout:seconds
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1379
    "set the send timeout - for special applications only"
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1380
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1381
    |millis|
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1382
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1383
    filePointer isNil ifTrue:[
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1384
	^ self error:'not a valid socket'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1385
    ].
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1386
    millis := (seconds * 1000) rounded.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1387
%{
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1388
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET) && defined(HZ)
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1389
    if (__isSmallInteger(millis)) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1390
	OBJ fp = _INST(filePointer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1391
	int sock;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1392
	int opt;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1393
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1394
	sock = fileno(MKFD(fp));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1395
	opt = _intVal(millis) / (1000 / HZ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1396
	setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&opt, sizeof(int));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1397
	RETURN(true);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1398
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1399
#endif
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1400
%}
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1401
.
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1402
    ^ false
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1403
! !
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1404
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1405
!Socket methodsFor:'datagram transmission'!
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1406
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1407
receiveFrom:anAddressBuffer buffer:aDataBuffer
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1408
    "receiver data - put address of originating host into
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1409
     anAddressBuffer, data into aBuffer. Both must be
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1410
     ByteArray-like.
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1411
     Return the number of bytes received."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1412
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1413
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1414
    OBJ oClass;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1415
    OBJ fp = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1416
    int nInstVars, nInstBytes, objSize;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1417
    int sock;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1418
    struct sockaddr_in sa ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1419
    int alen;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1420
    int n;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1421
    char *cp;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1422
    int flags = 0;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1423
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1424
    if (fp != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1425
	sock = fileno((FILE *)(_intVal(fp)));
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1426
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1427
	oClass = _Class(aDataBuffer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1428
	switch (_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1429
	    case BYTEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1430
	    case WORDARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1431
	    case LONGARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1432
	    case FLOATARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1433
	    case DOUBLEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1434
		break;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1435
	    default:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1436
		goto bad;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1437
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1438
	nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1439
	nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1440
	objSize = _Size(aDataBuffer) - nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1441
	cp = (char *)_InstPtr(aDataBuffer) + nInstBytes;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1442
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1443
	if (anAddressBuffer == nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1444
	    n = recvfrom(sock, cp, objSize, flags, (struct sockaddr *) 0, 0);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1445
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1446
	    n = recvfrom(sock, cp, objSize, flags, (struct sockaddr *) &sa, &alen);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1447
	    if (n >= 0) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1448
		oClass = _Class(anAddressBuffer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1449
		if ((_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) == BYTEARRAY) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1450
		    nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1451
		    nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1452
		    objSize = _Size(anAddressBuffer) - nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1453
		    cp = (char *)_InstPtr(anAddressBuffer) + nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1454
		    if (objSize >= alen) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1455
			bcopy((char *)&sa, cp, alen);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1456
		    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1457
		}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1458
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1459
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1460
	if (n >= 0) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1461
	    RETURN (_MKSMALLINT(n));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1462
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1463
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1464
	RETURN (_MKSMALLINT(-1));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1465
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1466
bad: ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1467
%}.
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1468
    "
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1469
     arrive here if you try to receive into an invalid buffer
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1470
     (i.e. not ByteArray-like)
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1471
    "
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1472
    self primitiveFailed
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1473
!
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1474
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1475
sendTo:anAddressBuffer buffer:aDataBuffer
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1476
    "send data - get address of destination host from
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1477
     anAddressBuffer, data from aDataBuffer. 
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1478
     Both must be ByteArray-like."
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1479
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1480
%{
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1481
    OBJ oClass;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1482
    OBJ fp = _INST(filePointer);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1483
    int nInstVars, nInstBytes, objSize;
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1484
    int sock;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1485
    struct sockaddr_in sa ;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1486
    int alen = sizeof(sa);
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1487
    int n;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1488
    char *cp;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1489
    int flags = 0;
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1490
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1491
    if (fp != nil) {
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1492
	sock = fileno((FILE *)(_intVal(fp)));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1493
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1494
	oClass = _Class(anAddressBuffer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1495
	if ((_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) == BYTEARRAY) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1496
	    nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1497
	    nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1498
	    objSize = _Size(anAddressBuffer) - nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1499
	    cp = (char *)_InstPtr(anAddressBuffer) + nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1500
	    if (objSize <= alen) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1501
		bcopy(cp, (char *)&sa, objSize);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1502
		alen = objSize;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1503
	    }
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1504
	}
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1505
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1506
	oClass = _Class(aDataBuffer);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1507
	switch (_intVal(_ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1508
	    case BYTEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1509
	    case WORDARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1510
	    case LONGARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1511
	    case FLOATARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1512
	    case DOUBLEARRAY:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1513
		break;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1514
	    default:
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1515
		goto bad;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1516
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1517
	nInstVars = _intVal(_ClassInstPtr(oClass)->c_ninstvars);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1518
	nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1519
	objSize = _Size(aDataBuffer) - nInstBytes;
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1520
	cp = (char *)_InstPtr(aDataBuffer) + nInstBytes;
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1521
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1522
	if (anAddressBuffer == nil) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1523
	    n = sendto(sock, cp, objSize, flags, (struct sockaddr *) 0, 0);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1524
	} else {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1525
	    n = sendto(sock, cp, objSize, flags, (struct sockaddr *) &sa, alen);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1526
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1527
	if (n >= 0) {
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1528
	    RETURN (_MKSMALLINT(n));
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1529
	}
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1530
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1531
	RETURN (_MKSMALLINT(-1));
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1532
    }
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1533
bad: ;
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
  1534
%}.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  1535
    self primitiveFailed
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1536
! !