Beispiel #1
0
int ftp_receive_file(char *filename, char *command)
{
	int rc,state;
	int dtp=E_REFUSE;

	if (ftp_use_port!='Y') { dtp = ftp_passive_connect(); }
/*	if (dtp==E_REFUSE) { dtp = ftp_listen_connect(); } */
	if (dtp==E_REFUSE) { dtp = ftp_port_connect(); }
	if (dtp>=0) {
		rc = news_send_command( fpi, command );
/*		rc=CNbyte_count(dtp);
		fprintf( log, "Pre-Listen CNbyte_count returns %d, %s \n", rc, get_err_text(rc));
*/
		if (CNbyte_count( dtp )==E_LISTEN) {
			if ((state=ftp_listen( dtp ))>=0) {	state = E_NORMAL; }
		} else {
			state = TCP_wait_state( dtp, TESTABLISH, 15 );
		}
		if (state==E_NORMAL) {
			rc = ftp_receive_continuations( fpi, "dummy", FALSE );
			rc = news_receive( dtp, filename, 2 );
		} else {
			fprintf( log, "TCP_wait_state returns %s \n", get_err_text(state));
			rc=CNbyte_count(dtp);
			fprintf( log, "CNbyte_count returns %d, %s \n", rc, get_err_text(rc));
			rc = state;
		}
		TCP_close( dtp, 5 );	/* wait for connection to close */
	} else {
		fprintf( log, "open_connection returns %s \n", get_err_text(dtp));
		rc = dtp;
	}
	return(rc);
}
Beispiel #2
0
int16 lprConnect(char* host)
{
	CAB cab;
	int16 tcpHndl, state;

/* remote and local port numbers for lpr connection */

	cab.rport = LPR_REM_PORT;
	cab.lport = LPR_LOC_PORT+(int)(Random() % 10);
	cab.lhost = 0;

	if (resolve(host, NULL, &(cab.rhost), 1) < 1) {
		uiPrintf(uiH, uiPrERR, "unknown remote host");
		return 0;
	}

	if( (tcpHndl = TCP_open((uint32)&cab, TCP_ACTIVE, 0, tcpBuffSize)) <= 0 ) {
		uiPrintf(uiH, uiPrERR, "could not open connection");
		return 0;
	}

    if ( (state = TCP_wait_state(tcpHndl, TESTABLISH, 30)) < 0 ) {
		uiPrintf(uiH, uiPrERR, "%s", get_err_text(state));
		return 0;
    }

	return tcpHndl;
}
Beispiel #3
0
static void recvJob(int16 cnId)
{
	int16 nInQueue;
	clock_t tQuit;

	while (1) {		/* loop over subcommands */

		tQuit = clock() + TIMEOUT * CLK_TCK;	/* time to quit at */
		while ( (nInQueue = CNbyte_count(cnId)) == 0 || nInQueue == E_NODATA) {
			if (clock() > tQuit) {
		        uiPrintf(uiH, uiPrERR, "rcvJob|timed out");
				return;
			}
			uiYield(uiH, YIELDMS);		/* wait till something arrives */
		} 

		if (nInQueue == E_EOF)
			return;						/* connection closed, no more subcommands */
	
		if (nInQueue > 0) {
			NDB* ndb;
			if ( (ndb = CNget_NDB(cnId)) != NULL ) {
				dispatchSubCmd(cnId, ndb);
			} else {
		        uiPrintf(uiH, uiPrERR, "recvJob|get_NDB");
			}

		} else {
			uiPrintf(uiH, uiPrERR, "recvJob|%s", get_err_text(nInQueue));
			return;
		}

	}	/* while..more subcommands */

}	/* recvJob */
Beispiel #4
0
/* discard extraneous data after timeout */
int news_discard( int cn )
{
	int16 bytes_available,x;
	int sbuf=sizeof(buffer);

/*	fprintf( log, "in news_discard(%d)\n", cn );  fflush(log); */
	while ((bytes_available=CNbyte_count(cn))>0) {

		if (handle_escape_events()==27) break;
/*
		if (Bconstat(2)==-1 && (Bconin(2) & 0xFF)==27) {
			break;
		}
*/
		if (bytes_available>sbuf) { bytes_available=sbuf; }
		CNget_block(cn, buffer, bytes_available);
	}
	if (bytes_available<0) {
		x=bytes_available;
		fprintf( log, "CNbyte_count(%d) returns (%d) %s \n", cn, x, get_err_text(x));
		fflush( log );
	}
/*	fprintf( log, "completed news_discard(%d)\n", cn );  fflush(log); */
	return(bytes_available);
}
char *get_response(request_t *req, int* req_len) {
	struct stat s;
	char *buffer;
	char path_buffer[1024];
	int fp;

	if (req->response_code == 400) {
		strcpy(req->resp_string, "400");
		strcpy(req->request_line, "--");
		buffer = malloc(1024);
		*req_len = get_err_text(req->response_code, buffer, 1024);
		return buffer;
	}
	req_path_string(req, path_buffer, sizeof(path_buffer));
	if (stat(path_buffer, &s) == -1 || S_ISDIR(s.st_mode)) {
		if (errno == ENOENT) {
			req->response_code = 404;
			strcpy(req->resp_string, "404");
		} else if (errno == EACCES) {
			req->response_code = 403;
			strcpy(req->resp_string, "403");
		}
		if (S_ISDIR(s.st_mode)) {
			req->response_code = 403;
			strcpy(req->resp_string, "403");
		}
		buffer = malloc(1024);
		*req_len = get_err_text(req->response_code, buffer, 1024);
		return buffer;
	}
	
	if ((fp = open(path_buffer, O_RDONLY)) == -1) {
		req->response_code = 403;
		strcpy(req->resp_string, "403");
		buffer = malloc(1024);
		*req_len = get_err_text(req->response_code, buffer, 1024);
		return buffer;
	}
	buffer = malloc(s.st_size);
	read(fp, buffer, s.st_size);
	*req_len = s.st_size;
	return buffer;
}
Beispiel #6
0
/* connect to the newsserver */
int	news_connect( char *news_server )
{
	int rc;

	if (carrier_detect()>=0) {
		ncn=open_connection( news_server, STANDARD_NEWS_PORT, 0); }
	if (ncn<0) {
		fprintf( log, "open_connection returns %s \n", get_err_text(ncn));
		browser->msg_status(0, ncn);
	} else {
	/*	rc = news_send_command( ncn, "mode reader" ); */
		rc = news_receive( ncn, "dummy", FALSE );	/* get response from server */
	}
	return(ncn);
}
Beispiel #7
0
int open_socket(char *hostname, int por)
	{
	int cn, x;
	unsigned long rhost;
	char *realhostname;
	char out[80];

	tflag=1;
	if ((x = resolve(hostname, &realhostname/*(char **)NULL*/, 
			&rhost, 1)) < 0)
		{
		sprintf(out, "Open error: %s", get_err_text(x));
		wind_set(win.handle, WF_INFO, (short)((long)out>>16), (short)(out), NULL,
				 NULL);
		return (-1);
		}
Beispiel #8
0
int ftp_connect(char *ftp_server, int port)
{
	int rc;

	if (carrier_detect()>=0) {
		fpi = open_connection( ftp_server, port, 0 ); }
	if (fpi<0) {
		fprintf( log, "open_connection returns %s \n", get_err_text(fpi));
		browser->msg_status(0, fpi);
	} else {
		rc = ftp_receive_continuations( fpi, "dummy", FALSE );	/* get response from server */
	/*	rc = news_receive( fpi, "dummy", FALSE );	/* get response from server */
	/*	fputs( header, log ); */
	}
	pasv_failed=0;
	return(fpi);
}
Beispiel #9
0
static void output(int16 cnId, char *oStr, int oLen)
{
	int16 rc;
	clock_t tQuit = clock() + TIMEOUT * CLK_TCK;	/* time to quit at */

	while ( (rc = TCP_send(cnId, oStr, oLen)) == E_OBUFFULL ) {
		if (clock() > tQuit) {
	        uiPrintf(uiH, uiPrERR, "output timed out");
			return;
		}
		uiYield(uiH, YIELDMS);
	} 

	if (rc != E_NORMAL) {
        uiPrintf(uiH, uiPrERR, "output|%s", get_err_text(rc));
	}

}	/* end output */
Beispiel #10
0
int close_socket(int cn)
	{
	int tstat,i,j;
	char out[80];

	tstat = (int)TCP_close(cn, 0);
	  /**/ sprintf(out, "%s", get_err_text(tstat));
	wind_set(win.handle, WF_INFO, (short)((long)out>>16), (short)(out), NULL,
 NULL);/**/
		sprintf(out, "Closing connection");
		wind_set(win.handle, WF_INFO, (short)((long)out>>16), (short)(out), NULL, NULL);
		menu_ienable(menu_ptr,OpenHostO,1);
		menu_ienable(menu_ptr,CloseC,0);
		menu_ienable(menu_ptr,OpenLocalL,1);
for (i=0;i<=10000;i++)
	{for (j=0; j<=100;j++);}
	return (tstat);
}
Beispiel #11
0
static void output(int16 cnId, char *o_str, int o_len)
{
	int16 rc;
	clock_t to = clock() + TIMEOUT * CLK_TCK;	/* time to quit at */

	/* wait if previous stuff was not yet sent */
	while ( (rc = TCP_send(cnId, o_str, o_len)) == E_OBUFFULL) {
		if (clock() > to) {
			uiPrintf(uiH, uiPrERR, "output: send timed out");
			return;
		}
		uiYield(uiH, YIELDMS);
	} 

	if (rc != E_NORMAL) {
		uiPrintf(uiH, uiPrERR, "output: %s", get_err_text(rc));
	}

}	/* end output */
Beispiel #12
0
int imap_connect(char *imap_server, int port)
{
	int rc;
	char server[80];

	if (port==0) { port = IMAP_PORT; }
	strcpy( server, imap_server );
	if (server[0]=='\0') { strcpy( server, DEFAULT_IMAP_SERVER ); }

	if (carrier_detect()>=0) { imapi = open_connection( server, port, 0 ); }
	if (imapi<0) {
		fprintf( log, "open_connection returns %s \n", get_err_text(imapi));
		browser->msg_status(0, imapi);
	} else {
	/*	rc = imap_receive_continuations( imapi, "dummy", FALSE, "*" );	/* get response from server */
		rc = news_receive( imapi, "dummy", FALSE );	/* get response from server */
		if (header[0]=='*') { imap_queue_unsolicited( header ); }
	/*	fputs( header, log ); */
	}
	return(imapi);
}
Beispiel #13
0
/* send data to the server on connection cn */
int	news_send(int cn, char *data)
{
	int x;
	char data_string[300];

	x=news_discard( cn );		/* discard residual data */
	if (x<E_NORMAL) {
		browser->msg_status(0, x);
		if (x==E_BADHANDLE&&cn==ncn) { ncn= NO_CONNECTION; }
		return(x);
	}
	sprintf( data_string, "%s\r\n", data );
	do {
		x = TCP_send( cn, data_string, (int16) strlen(data_string) );
	} while (x==E_OBUFFULL);	/* retry if 'Output Buffer full */
	browser->msg_status(5, 0);
	if (x<E_NORMAL) {
		fprintf( log, "TCP_send returns %s \n", get_err_text(x));
		fflush( log );
		browser->msg_status(0, x);
	}
	return(x);
}
Beispiel #14
0
static void dumpFile(int16 cnId, char fileNam[], long fileLen)
{
	int eFlag;
	char *eM;
	long accuLen;
	int fh;
	int16 nInQueue;
	clock_t tQuit;

#if 0
uiPrintf(uiH, "   %s|L: %ld|N: %s", pCnt, fileLen, fileNam);
#endif
	if ( (fh=Fcreate(fileNam, 0)) < 0 ) {
		uiPrintf(uiH, uiPrERR, "dumpFile|cannot create file");
		return;
	}


	for (eFlag=1,accuLen=0; eFlag; ) {
		tQuit = clock() + LTIMEOUT * CLK_TCK;	/* time to quit at */

		while ( (nInQueue = CNbyte_count(cnId)) == 0 || nInQueue == E_NODATA) {
			if (clock() > tQuit) {
		        eM="timed out"; goto errExit;
			}
			uiYield(uiH, YIELDMS);		/* wait till something arrives */
		} 
	
	
		if (nInQueue > 0) {
			NDB* ndb;
	
			if ( (ndb = CNget_NDB(cnId)) != NULL ) {
				accuLen += ndb->len;
#if 0
uiPrintf(uiH, "al: %ld", accuLen);
#endif
				if (accuLen == fileLen+1) {		/* this happens at the end */
					if (Fwrite(fh, ndb->len-1, ndb->ndata) <0) {
						eM="cannot write 1"; goto errExit;
					}
					if (ndb->ndata[ndb->len-1] != '\0') {
						eM="trailing 0 ?"; goto errExit;
					}
					eFlag=0;						/* normal end */
				} else {
					if (accuLen > fileLen+1) {	/* this should never happen */
						eM="prot.mismatch"; goto errExit;
					} else {
						if (Fwrite(fh, ndb->len, ndb->ndata) <0) {
							eM="cannot write 2"; goto errExit;
						}
					}
				}
				KRfree(ndb->ptr); KRfree(ndb);	/* throw ndb away */

			} else {
		        eM="get_NDB"; goto errExit;
			}	/* if..get_NDB successful */

		} else {
			eM=get_err_text(nInQueue); goto errExit;
		}	/* if..something in Queue */

	}	/* while..more blocks to read */


	Fclose(fh);
	return;

errExit:
	uiPrintf(uiH, uiPrERR, "dumpFile|%s", eM);
	Fclose(fh);
}	/* dumpFile */
Beispiel #15
0
static void waitRequests(void)
{
	int16 cnId, state;
	int16 nInQueue;
	int toggle, proceed=1;


	do {				/* listen again */
		if( (cnId = TCP_open(0, LPR_LOC_PORT, 0, tcpBuffSize)) <= 0 ) {
			uiPrintf(uiH, uiPrERR, "waitRequests|TCP_open");
			return;
		}
	
	    if ( (state = TCP_wait_state(cnId, TLISTEN, 30)) < 0 ) {
	        uiPrintf(uiH, uiPrERR, "waitRequests|%s", get_err_text(state));
			return;
	    }
	
	
		toggle = 10;	/* every ten waits look also for an AES message */
		while ( (nInQueue = CNbyte_count(cnId)) != E_EOF ) {	/* poll for input */
	
			/* listening or no data yet cause us to wait */
			if (nInQueue == E_LISTEN || nInQueue == 0 || nInQueue == E_NODATA) {
				if (--toggle>0) {
					uiYield(uiH, YIELDMS);
				} else {
					WORD	msgbuff[8];
					WORD	event;		/* Ergebnis mit Ereignissen */
					WORD	mx, my,		/* Mauskoordinaten */
							mbutton, 	/* Mausknopf */
							mkstate,	/* keyb shift status for mouse button */
							mclicks; 	/* Anzahl Mausklicks */
					UWORD	keycode; 	/* scancode + asciicode */

					toggle=10;
					event = evnt_multi(
						MU_MESAG | MU_TIMER,
						0, 0, 0,
						0, 0, 0, 0, 0,
						0, 0, 0, 0, 0,
						msgbuff,
					  	YIELDMS, 0,
						&mx, &my,
						&mbutton, &mkstate,
						&keycode, &mclicks);

					if ( (event & MU_MESAG) && msgbuff[0] == AP_TERM ) {
						proceed=0;		/* no more new connections */
						break;			/* end listening */
					}
				}

			} else {

				if (nInQueue > 0) {			/* otherwise there is valid data */
					NDB* ndb;
		
					if ( (ndb = CNget_NDB(cnId)) != NULL ) {
						dispatchD(cnId, ndb);
					} else {
				        uiPrintf(uiH, uiPrERR, "waitRequests|get_NDB");
						break;
					}
		
				} else {					/* catch other errors */
					uiPrintf(uiH, uiPrERR, "waitRequests|%s", get_err_text(nInQueue));
					break;
				}	/* if valid data */

			}	/* if any data */
	
		}	/* while wait for a request */
	
	
		TCP_close(cnId, TIMEOUT, NULL);	/* disconnect */

	} while (proceed);	/* while new connection shall be done */


}	/* waitRequests */
Beispiel #16
0
/* wait for the response from the newsserver */
int news_receive(int cn, char *file, int file_reqd)
{
	/* copied from http_get in CABCOVL.C  */
	int16 x, bytes_available, eof=0;
	long bytes_read=0,rc;
	int return_code=0;
	int file_handle, status=0, header_pos=0;
	time_t timeout,kicker,total;
	int bug=0;
	int sbuf=sizeof(buffer);

	if (file_reqd) {
		file_handle=(int) Fcreate(file, 0);
		if (bug) {
			fprintf( log, "news_receive - opening file = %d\n", file_handle );
			fflush( log );
		}
		if (file_handle<0) {
			#ifdef ERR_MSGS
				printf("Couldn't create %s!\n", file);
			#endif
			return(1);
		}
	}
	total=clock();					/* total time in routine */
	timeout=clock()+max_to*CLK_TCK;	/* timeout */
	kicker=clock()+kick*CLK_TCK;		/* conversation kicker */
	if (file_reqd) {
		browser->msg_status(2,0); /* Getting data... */
	}
	if (file_reqd==2) { status=2; }

	while (eof==0) {
		bytes_available=CNbyte_count(cn);
		/* printf("received %d bytes \n", (long)bytes_available ); */

		if (handle_escape_events()==27) { eof=4; }
		/*
		if (Bconstat(2)==-1 && (Bconin(2) & 0xFF)==27) { eof=4;	}
		*/
		if (clock()>timeout) {
			#ifdef MDEBUG
				printf("Timeout!\n");
			#endif
			eof=2;
		} else if (clock()>kicker) {
			#ifdef MDEBUG
				printf("Kick Connection!\n");
			#endif
			CNkick(cn);
			kicker=clock()+kick*CLK_TCK;	/* conversation kicker */
		} else if (bytes_available==E_EOF) {
			#ifdef MDEBUG
				printf("EOF!\n");
			#endif
			eof=1;
		} else if (bytes_available<E_NODATA) {
			#ifdef ERR_MSGS
				printf("CNbyte_count() returns: %s\n", get_err_text(bytes_available));
			#endif
			eof=3;
		} else if (bytes_available>0) {
			timeout=clock()+char_to*CLK_TCK;	/* timeout after last char */
			kicker=clock()+kick*CLK_TCK;		/* conversation kicker */
			if (status==2) {
				if (bytes_available>sbuf) { bytes_available=sbuf; }
				if (CNget_block(cn, buffer, bytes_available)>=E_NODATA) {
					rc = Fwrite(file_handle, bytes_available, &buffer);
					if (rc!=bytes_available) { 	/* didn't write everything */
						file_write_error(rc);
						Fclose(file_handle);
						return(1);
					}
					bytes_read+=bytes_available;
					if (bug) {
						fprintf( log, "received %d bytes, total %ld\n",
							bytes_available , bytes_read);
						fflush( log );
					} else { browser->msg_status(2, bytes_read); }

				/* look for period (.) on a line by itself */
					if (strncmp(&buffer[bytes_available-5], "\r\n.\r\n", 5)==0 ||
					    strncmp(&buffer[bytes_available-5], "\n\r.\n\r", 5)==0 ||
					    strncmp(&buffer[bytes_available-3], "\r.\r", 3)==0 ||
					    strncmp(&buffer[bytes_available-3], "\n.\n", 3)==0)
					eof=1;
					if (bytes_read==3 &&
					    strncmp(&buffer[bytes_available-3], ".\r\n", 3)==0)
					eof=1;
				} else {
					#ifdef ERR_MSGS
						printf("Error in CNget_block()!\n");
					#endif
					eof=3;
				}
			} else {
				x = CNget_char(cn);
				if (x<E_NODATA) {
					#ifdef ERR_MSGS
						printf("CNget_char() returns: %s\n", get_err_text(x));
					#endif
					eof=3;
				} else
					header[header_pos++]=(char) x;
			}
			/* only an empty line and response line in NNTP responses */
			/* when status = 0, drop until valid non-control, when = 1, store in header */
			if (status==0) {
				if (strncmp(&header[header_pos-1], " ", 1)<0) {
					header_pos = 0;
				} else { status++;}
			}
			if (status==1) {
				if (strncmp(&header[header_pos-2], "\r\n", 2)==0 ||
				    strncmp(&header[header_pos-2], "\n\r", 2)==0) {
				/*	strncmp(&header[header_pos-1], "\r", 1)==0 ||
				    strncmp(&header[header_pos-1], "\n", 1)==0) { */
					header[header_pos-2]=0;
					if (log_resp=='Y') { fprintf( log, "%s\n", header ); fflush(log); }
					#ifdef MDEBUG
						printf("Header: %s\n", header );
						printf("End of header.\n");
					#endif
					if (!file_reqd) { eof=1; } else { status++; }
					if (memcmp(header,"423",3)==0) { eof=1; }
				} else if (header_pos>2000) {
					rc = Fwrite(file_handle, header_pos, header);
					if (rc!=header_pos) { 	/* didn't write everything */
						file_write_error(rc);
						Fclose(file_handle);
						return(1);
					}
					status++;
				}
			}
		}
	}
	#ifdef MDEBUG
	printf("EOF= %d \n", (long)eof );
	#endif

	if (eof>1) {	/* timeout or worse*/
	/*	x = (int16)TCP_close(cn, 2);
		if (x < 0) {
			#ifdef MDEBUG
				printf("TCP_close() returns: %s\n", get_err_text(x));
			#endif
		} 
	*/
		if (bug) {
			fprintf( log, "news_receive - error - eof = %d\n", eof );
			fflush( log );
		}	
		if (file_reqd) {
		#ifdef MDEBUG
			printf("Fclose returns %i\n", Fclose(file_handle));
		#else
			/**** I might get a bug here! ****/
			if((x=(int16)Fclose(file_handle))<0) {
				#ifdef ERR_MSGS
					printf("Error with Fclose! (%i)\n", x);
				#endif
			}
		#endif
			if (bug) {
				fprintf( log, "news_receive - error - closing file = %d\n", x );
				fflush( log );
			}
		}
		if (eof==3) { eof=bytes_available; }  /* return negative value */
		return(eof);
	}	

	if (file_reqd) {
		if (log_data=='Y') {
			total=clock()-total;	/* total time in clock ticks */
			if (total) {
				fprintf( log, "Transfer Rate = %ld cps\n", (bytes_read*CLK_TCK)/total ); fflush(log);
			}
		}
		#ifdef MDEBUG
			printf("Fclose returns %d\n", Fclose(file_handle));
		#else
			if((x=(int16)Fclose(file_handle))<0)	browser->msg_error(x);
		#endif
		if (bug) {
			fprintf( log, "news_receive - good - closing file = %d\n", x );
			fflush( log );
		}
	}
	#ifdef MDEBUG
		printf("Hit a key.\n");
		Bconin(2);
	#endif
	return(return_code);	/* return(0)     if getting data was successful,	 */
        					/* return(errno) if it fails, return an error number */
}
Beispiel #17
0
int ftp_send_file(char *filename, char *command)
{
	int rc,state,x;
	size_t bytes,total=0,timeout;
	char buff[512];
	FILE *fid;
	int dtp=E_REFUSE;

	if (ftp_use_port!='Y') { dtp = ftp_passive_connect(); }
/*	if (dtp==E_REFUSE) { dtp = ftp_listen_connect(); } */
	if (dtp==E_REFUSE) { dtp = ftp_port_connect(); }
	if (dtp>=0) {
		rc= ftp_allocate(filename);
		rc= news_send_command( fpi, command );
/*		rc=CNbyte_count(dtp);
		fprintf( log, "Pre-Listen CNbyte_count returns %d, %s \n", rc, get_err_text(rc));
*/
		if (CNbyte_count( dtp )==E_LISTEN) {
			if ((state=ftp_listen( dtp ))>=0) { state = E_NORMAL; }
		} else {
			state = TCP_wait_state( dtp, TESTABLISH, 15 );
		}
		if (state==E_NORMAL) {
			rc = ftp_receive_continuations( fpi, "dummy", FALSE );
			fid = fopen( filename, "rb" );
			if (fid!=NULL) {
				while ((bytes=fread( buff, 1, 512, fid))>0) {
					timeout=clock()+max_to*CLK_TCK;	/* timeout */
					do {
						x = TCP_send( dtp, buff, (int16)bytes );
						if (x!=0) {
							if (clock()>timeout) {
								if (x==E_OBUFFULL) { bytes=-FTP_OBUFF_SIZE; }
								x=E_CNTIMEOUT;
							}
						}
						if (handle_escape_events()==27) { x=E_USERTIMEOUT; }
 
					/*	if (Bconstat(2)==-1 && (Bconin(2) & 0xFF)==27) { /* Esc key */
					/*		x=E_USERTIMEOUT; } */
					} while (x==E_OBUFFULL);	/* retry if 'Output Buffer full */
					total+=bytes;
					browser->msg_status(8, total);
					if (x<0) {
						fprintf( log, "TCP_send returns %s \n", get_err_text(x));
						browser->msg_status(0, x);
						break;
					}
				}
				fclose( fid );
			}
		} else {
			fprintf( log, "TCP_wait_state returns %s \n", get_err_text(state));
			rc=CNbyte_count(dtp);
			fprintf( log, "CNbyte_count returns %d, %s \n", rc, get_err_text(rc));
			rc = state;
		}
		TCP_close( dtp, 5 );	/* wait for connection to close */
	} else {
		fprintf( log, "open_connection returns %s \n", get_err_text(dtp));
		rc = dtp;
	}
	return(rc);
}