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