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); }
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; }
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 */
/* 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; }
/* 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); }
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); }
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); }
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 */
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); }
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 */
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); }
/* 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); }
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 */
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 */
/* 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 */ }
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); }