Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/cs/vcs_src/ifs_network.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1990-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
/*
21
* File: ifs_network.c
22
*/
23
24
#include "ifs_agent.h"
25
#include <cs.h>
26
#include <error.h>
27
28
/*
29
*name: NetFillCache
30
* read data from network to cache buffer
31
* rtn: -1 if timeout
32
* 0 if end-of-file or IfsAbort
33
* size if read successful
34
*/
35
int
36
NetFillCache( nFile, timeout )
37
NetFile *nFile;
38
int timeout;
39
{
40
int rtn, num;
41
Cs_poll_t fds;
42
43
if( IfsAbortFlag ) {
44
nFile->size = 0;
45
return 0;
46
}
47
nFile->err = 0;
48
/* move the cache data to the beginning of netbuf */
49
if( nFile->size > 0 ) {
50
if( nFile->size >= sizeof(nFile->netbuf) )
51
return sizeof(nFile->netbuf); /* cache buffer full */
52
memcpy( nFile->netbuf, nFile->netbuf + nFile->head, nFile->size );
53
}
54
nFile->head = 0;
55
56
fds.fd = nFile->socket;
57
fds.events = CS_POLL_READ;
58
while( 1 ) {
59
rtn = cspoll( &fds, 1, timeout );
60
if( rtn >= 0 ) break;
61
62
/* error occured in select call */
63
nFile->err = errno;
64
if( errno != EINTR ) {
65
logit( "NetRead: select error\n" );
66
break;
67
}
68
if( IfsAbortFlag == 1 ) {
69
nFile->size = 0;
70
return 0;
71
}
72
logit( "NetRead: bypass signal\n" );
73
}
74
75
if( rtn == 0 ) {
76
/* select timeout */
77
if( timeout > 0 )
78
logit( "NetRead: timeout\n" );
79
return -1;
80
} else if( fds.status == CS_POLL_READ ) {
81
num = sizeof(nFile->netbuf) - nFile->size;
82
num = read( fds.fd, nFile->netbuf + nFile->size, num );
83
if( num > 0 )
84
nFile->size += num;
85
}
86
return nFile->size;
87
}
88
89
/*
90
*name: NetDataReady
91
* check if data ready in the cache or network buffer
92
* try read from network if the cache buffer is empty
93
*/
94
int
95
NetDataReady( nFile )
96
NetFile *nFile;
97
{
98
if( nFile->size == 0 )
99
NetFillCache( nFile, 0 );
100
return nFile->size;
101
}
102
103
/*
104
*name: NetEOF
105
* check if the network is closed
106
*/
107
int
108
NetEOF( nFile )
109
NetFile *nFile;
110
{
111
if( nFile->size > 0 ) { /* data exists */
112
return 0;
113
}
114
if( NetFillCache( nFile, 0 ) == 0 && nFile->size == 0 ) {
115
/* read successful & no data ready */
116
return 1;
117
}
118
return 0;
119
}
120
121
/*
122
*name: NetRead
123
* read a block of memory from NetFile.
124
* read to nFile->buf in NetFile if buf is NULL
125
*/
126
int
127
NetRead( nFile, buf, bufsize )
128
NetFile *nFile;
129
char *buf;
130
int bufsize;
131
{
132
int readlen;
133
int len;
134
135
if( IfsAbortFlag || nFile == NULL || buf == NULL )
136
return -1;
137
nFile->err = 0;
138
readlen = 0;
139
while( 1 ) {
140
/* read data from cache buf */
141
if( (len = nFile->size) > 0 ) {
142
if( len > bufsize )
143
len = bufsize;
144
memcpy( buf, nFile->netbuf + nFile->head, len );
145
nFile->head += len;
146
nFile->size -= len;
147
readlen += len;
148
if( len >= bufsize )
149
return readlen; /* buffer full */
150
buf += len;
151
bufsize -= len;
152
}
153
if( NetFillCache( nFile, SOCK_TIMEOUT ) == -1 || nFile->size == 0 ) {
154
return( readlen > 0 ? readlen : -1 );
155
}
156
}
157
}
158
159
/*
160
*name: NetGets
161
* read a string (end with '\n') from NetFile.
162
*/
163
char*
164
NetGets( nFile, buf, bufsize )
165
NetFile *nFile;
166
char *buf;
167
int bufsize;
168
{
169
char *ptr;
170
171
if( IfsAbortFlag || nFile == NULL || buf == NULL )
172
return NULL;
173
ptr = buf;
174
while( bufsize > 1 && NetRead( nFile, ptr, 1 ) == 1 ) {
175
bufsize--;
176
if( *ptr++ == '\n' )
177
break;
178
}
179
*ptr = '\0';
180
return( ptr == buf ? NULL : buf );
181
}
182
183
/*
184
*name: NetWrite
185
* write a block of memory to Netfile
186
*/
187
int
188
NetWrite( nFile, buf, bufsize )
189
NetFile *nFile;
190
char *buf;
191
int bufsize;
192
{
193
int fd, writelen, len;
194
195
if( IfsAbortFlag || nFile == NULL || buf == NULL )
196
return -1;
197
fd = nFile->socket;
198
writelen = 0;
199
while( bufsize > 0 ) {
200
len = write( fd, buf, bufsize );
201
if( len <= 0 ) {
202
nFile->err = errno;
203
break;
204
}
205
buf += len;
206
bufsize -= len;
207
writelen += len;
208
}
209
return writelen;
210
}
211
212
/*
213
*name: NetClose
214
* close a network file opened by NetConnect
215
*/
216
int
217
NetClose( nFile )
218
NetFile *nFile;
219
{
220
int rtn;
221
222
if( nFile == NULL )
223
return -1;
224
rtn = close( nFile->socket );
225
free( nFile );
226
return rtn;
227
}
228
229
/*
230
*name: NetConnect
231
* make a socket connection to host:port.
232
* connect to proxy hosts if proxy flag is on.
233
*/
234
NetFile *
235
NetConnect( srv, host, port )
236
struct server_info *srv;
237
char *host;
238
int port;
239
{
240
static struct server_info nilsrv;
241
NetFile* nFile;
242
unsigned long addr;
243
int fd;
244
char buf[ STRLEN ];
245
246
if ((srv->flags & IFS_PROXY) || !(addr = csaddr(host)) && srv->proxy) {
247
nFile = NetConnect( &nilsrv, srv->proxy ? srv->proxy : PROXY_HOST, PROXY_PORT );
248
if( nFile == NULL )
249
return NULL;
250
sfsprintf( buf, sizeof(buf), "\ntcp!%s!%d\n\n%s\nvcs\n0\n-1\n-1\n",
251
host, port, csname(0) );
252
NetWrite( nFile, buf, strlen(buf) );
253
if( NetGets( nFile, buf, sizeof(buf) ) != NULL &&
254
strcmp( buf, "0\n" ) == 0 ) {
255
NetGets( nFile, buf, sizeof(buf) );
256
logit( "proxy reply: " );
257
logit( buf );
258
return nFile;
259
}
260
NetClose( nFile );
261
return NULL;
262
}
263
if (!addr) {
264
cserrno = E_GETHOST;
265
return NULL;
266
}
267
if( (fd = csbind( "tcp", addr, port, 0 )) < 0 )
268
return NULL;
269
if (!(nFile = (NetFile*)malloc(sizeof(NetFile))))
270
return NULL;
271
nFile->socket = fd;
272
nFile->head = 0;
273
nFile->size = 0;
274
nFile->err = 0;
275
return nFile;
276
}
277
278