netspool init phase
This commit is contained in:
parent
0683dc37da
commit
9f87fcc37f
@ -2,3 +2,7 @@ tx_zmodem
|
|||||||
rx_zmodem
|
rx_zmodem
|
||||||
hydra
|
hydra
|
||||||
binkp_transfer
|
binkp_transfer
|
||||||
|
|
||||||
|
|
||||||
|
all of then do use p_tx_readfile
|
||||||
|
|
@ -8,41 +8,41 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
|
||||||
const char *RHOST = "::ffff:172.31.251.3";
|
#include "netspool.h"
|
||||||
|
|
||||||
|
const char *RHOST = "172.31.251.3";
|
||||||
const char *RPORT = "24555";
|
const char *RPORT = "24555";
|
||||||
|
|
||||||
#define STRBUF (1024)
|
|
||||||
|
|
||||||
void readstr(int s, char *buf, int len) {
|
int readstr(int s, char *buf, int len) {
|
||||||
char c=0;
|
char c=0;
|
||||||
int r;
|
int r;
|
||||||
while(1) {
|
while(1) {
|
||||||
r=recv(s, &c, 1, 0);
|
r=recv(s, &c, 1, 0);
|
||||||
if(r==0){
|
if(r==0){
|
||||||
puts("remote socket shutdown");
|
puts("remote socket shutdown");
|
||||||
exit(-3);
|
return -3;
|
||||||
}
|
}
|
||||||
if(r==-1){
|
if(r==-1){
|
||||||
puts("error reading string");
|
puts("error reading string");
|
||||||
printf("%d %s\n", errno, strerror(errno));
|
printf("%d %s\n", errno, strerror(errno));
|
||||||
exit(-3);
|
return -3;
|
||||||
}
|
}
|
||||||
if(c=='\n') {
|
if(c=='\n') {
|
||||||
*buf=0;
|
*buf=0;
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
*buf++=c;
|
*buf++=c;
|
||||||
if(c=='\n')
|
|
||||||
return;
|
|
||||||
len--;
|
len--;
|
||||||
if(!len) {
|
if(!len) {
|
||||||
puts("string buffer overflow");
|
puts("string buffer overflow");
|
||||||
exit(-3);
|
return -3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendstr(int s, const char *buf) {
|
int sendstr(int s, const char *buf) {
|
||||||
int l = strlen(buf);
|
int l = strlen(buf);
|
||||||
int c;
|
int c;
|
||||||
char nl='\n';
|
char nl='\n';
|
||||||
@ -51,11 +51,11 @@ void sendstr(int s, const char *buf) {
|
|||||||
if(c==-1){
|
if(c==-1){
|
||||||
puts("error sending string");
|
puts("error sending string");
|
||||||
printf("%d %s\n", errno, strerror(errno));
|
printf("%d %s\n", errno, strerror(errno));
|
||||||
exit(-3);
|
return -3;
|
||||||
}
|
}
|
||||||
if(c==0){
|
if(c==0){
|
||||||
puts("zero send: may loop infinitely");
|
puts("zero send: may loop infinitely");
|
||||||
exit(-3);
|
return -3;
|
||||||
}
|
}
|
||||||
l-=c;
|
l-=c;
|
||||||
}
|
}
|
||||||
@ -63,15 +63,132 @@ void sendstr(int s, const char *buf) {
|
|||||||
if(c==-1){
|
if(c==-1){
|
||||||
puts("error sending string");
|
puts("error sending string");
|
||||||
printf("%d %s\n", errno, strerror(errno));
|
printf("%d %s\n", errno, strerror(errno));
|
||||||
exit(-3);
|
return -3;
|
||||||
}
|
}
|
||||||
if(c==0){
|
if(c==0){
|
||||||
puts("zero send: may loop infinitely");
|
puts("zero send: may loop infinitely");
|
||||||
exit(-3);
|
return -3;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void netspool_start(s_netspool_state *state, const char *host, const char *port, const char *address, const char *password)
|
||||||
|
{
|
||||||
|
int s, r;
|
||||||
|
struct addrinfo hint;
|
||||||
|
struct addrinfo *addrs, *a;
|
||||||
|
char strbuf[STRBUF];
|
||||||
|
|
||||||
|
s = socket(AF_INET6, SOCK_STREAM, 0);
|
||||||
|
state->socket = s;
|
||||||
|
if( s==-1 )
|
||||||
|
{
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "socket error";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&hint, 0, sizeof(struct addrinfo));
|
||||||
|
hint.ai_socktype = SOCK_STREAM;
|
||||||
|
hint.ai_family = PF_INET6;
|
||||||
|
hint.ai_flags = AI_V4MAPPED;
|
||||||
|
|
||||||
|
r = getaddrinfo(host, port!=NULL? port: "24555", &hint, &addrs);
|
||||||
|
|
||||||
|
if( r ) {
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = gai_error(r);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
a=addrs;
|
||||||
|
r=-1;
|
||||||
|
while(a) {
|
||||||
|
r = connect(s, a->ai_addr, a->ai_addrlen);
|
||||||
|
if(r==-1) {
|
||||||
|
printf("%d %s\n", errno, strerror(errno));
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
a=a->ai_next;
|
||||||
|
}
|
||||||
|
freeaddrinfo(addrs);
|
||||||
|
|
||||||
|
if(r==-1) {
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "could not connect\n"
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = readstr(s, strbuf, STRBUF);
|
||||||
|
if( r ) { state->state = NS_ERROR; state->error = "IO error"; }
|
||||||
|
puts(strbuf);
|
||||||
|
|
||||||
|
snprintf(strbuf, STRBUF, "ADDRESS %s", address);
|
||||||
|
r = sendstr(s, strbuf);
|
||||||
|
if( r ) { state->state = NS_ERROR; state->error = "IO error"; }
|
||||||
|
|
||||||
|
snprintf(strbuf, STRBUF, "PASSWORD %s", password);
|
||||||
|
r = sendstr(s, strbuf);
|
||||||
|
if( r ) { state->state = NS_ERROR; state->error = "IO error"; }
|
||||||
|
|
||||||
|
state->state = NS_READY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void netspool_query(s_netspool_state *state, const char *what)
|
||||||
|
{
|
||||||
|
int r = sendstr(state->socket, "GET ALL");
|
||||||
|
if( r ) {
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "IO error";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
state->state = NS_RECEIVING;
|
||||||
|
}
|
||||||
|
|
||||||
|
void netspool_receive(s_netspool_state *state)
|
||||||
|
{
|
||||||
|
char strbuf[STRBUF];
|
||||||
|
int r;
|
||||||
|
|
||||||
|
r = readstr(s, strbuf, STRBUF);
|
||||||
|
if( r ) { state->state = NS_ERROR; state->error = "IO error"; return; }
|
||||||
|
puts(strbuf);
|
||||||
|
if(strcmp(strbuf, "QUEUE EMPTY")==0) {
|
||||||
|
state->state = NS_READY;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strncmp(strbuf, "FILENAME ", 9)==0) {
|
||||||
|
strcpy(filename, strbuf+9);
|
||||||
|
puts(filename);
|
||||||
|
} else {
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "expected filename or queue empty"
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = readstr(s, strbuf, STRBUF);
|
||||||
|
if( r ) { state->state = NS_ERROR; state->error = "IO error"; return; }
|
||||||
|
if(strncmp(strbuf, "BINARY ", 7)==0) {
|
||||||
|
/*if(filename[0]==0) {
|
||||||
|
puts("no filename");
|
||||||
|
exit(-5);
|
||||||
|
} */
|
||||||
|
sscanf(strbuf+7, "%Lu", &state->length);
|
||||||
|
printf("length=%Lu\n", state->length);
|
||||||
|
state->state = NS_RECVFILE;
|
||||||
|
} else {
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "expected binary"
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void savefile(const char *fn, unsigned long long l, int s)
|
void savefile(const char *fn, unsigned long long l, int s)
|
||||||
{
|
{
|
||||||
char BUF[STRBUF];
|
char BUF[STRBUF];
|
||||||
@ -105,64 +222,15 @@ void savefile(const char *fn, unsigned long long l, int s)
|
|||||||
close(f);
|
close(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
int s, r;
|
|
||||||
struct addrinfo hint;
|
|
||||||
struct addrinfo *addrs, *a;
|
|
||||||
char strbuf[STRBUF];
|
|
||||||
char filename[STRBUF];
|
char filename[STRBUF];
|
||||||
unsigned long long length;
|
unsigned long long length;
|
||||||
|
|
||||||
s = socket(AF_INET6, SOCK_STREAM, 0);
|
|
||||||
|
|
||||||
memset(&hint, 0, sizeof(struct addrinfo));
|
|
||||||
hint.ai_socktype = SOCK_STREAM;
|
|
||||||
r = getaddrinfo(RHOST, RPORT, &hint, &addrs);
|
|
||||||
if( r ) {
|
|
||||||
puts(gai_strerror(r));
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
a=addrs;
|
|
||||||
r=-1;
|
|
||||||
while(a) {
|
|
||||||
r = connect(s, a->ai_addr, a->ai_addrlen);
|
|
||||||
if(r==-1) {
|
|
||||||
printf("%d %s\n", errno, strerror(errno));
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
a=a->ai_next;
|
|
||||||
}
|
|
||||||
if(r==-1) {
|
|
||||||
printf("could not connect\n");
|
|
||||||
exit(-2);
|
|
||||||
}
|
|
||||||
freeaddrinfo(addrs);
|
|
||||||
|
|
||||||
readstr(s, strbuf, STRBUF);
|
|
||||||
puts(strbuf);
|
|
||||||
sendstr(s, "ADDRESS 2:111/11");
|
|
||||||
sendstr(s, "PASSWORD 123");
|
|
||||||
sendstr(s, "GET ALL");
|
|
||||||
|
|
||||||
filename[0]=0;
|
filename[0]=0;
|
||||||
while(1) {
|
while(1) {
|
||||||
readstr(s, strbuf, STRBUF);
|
|
||||||
puts(strbuf);
|
|
||||||
if(strcmp(strbuf, "QUEUE EMPTY")==0) break;
|
|
||||||
if(strncmp(strbuf, "FILENAME ", 9)==0) {
|
|
||||||
strcpy(filename, strbuf+9);
|
|
||||||
puts(filename);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(strncmp(strbuf, "BINARY ", 7)==0) {
|
|
||||||
if(filename[0]==0) {
|
|
||||||
puts("no filename");
|
|
||||||
exit(-5);
|
|
||||||
}
|
|
||||||
sscanf(strbuf+7, "%Lu", &length);
|
|
||||||
printf("length=%Lu\n", length);
|
|
||||||
savefile(filename, length, s);
|
savefile(filename, length, s);
|
||||||
sprintf(strbuf, "DONE %s", filename);
|
sprintf(strbuf, "DONE %s", filename);
|
||||||
sendstr(s, strbuf);
|
sendstr(s, strbuf);
|
||||||
@ -178,3 +246,4 @@ void main() {
|
|||||||
close(s);
|
close(s);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*/
|
@ -40,13 +40,15 @@ const char *Protocols[] =
|
|||||||
* Return value:
|
* Return value:
|
||||||
* Zero value on success and non-zero if nothing to send
|
* Zero value on success and non-zero if nothing to send
|
||||||
*/
|
*/
|
||||||
static int prot_get_next_file(s_filelist **dest, s_protinfo *pi, s_fsqueue *q)
|
static int prot_get_next_file(s_filelist **dest, s_protinfo *pi)
|
||||||
{
|
{
|
||||||
s_filelist *ptrl = NULL;
|
s_filelist *ptrl = NULL;
|
||||||
s_filelist *best = NULL;
|
s_filelist *best = NULL;
|
||||||
|
s_fsqueue *q = &state.queue;
|
||||||
|
|
||||||
*dest = NULL;
|
*dest = NULL;
|
||||||
|
|
||||||
|
/* local queue */
|
||||||
for( ptrl = q->fslist; ptrl; ptrl = ptrl->next )
|
for( ptrl = q->fslist; ptrl; ptrl = ptrl->next )
|
||||||
if( ptrl->status == STATUS_WILLSEND )
|
if( ptrl->status == STATUS_WILLSEND )
|
||||||
{
|
{
|
||||||
@ -97,6 +99,44 @@ static int prot_get_next_file(s_filelist **dest, s_protinfo *pi, s_fsqueue *q)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* network queue */
|
||||||
|
#ifdef NETSPOOL
|
||||||
|
|
||||||
|
if(state.netspool.state == NS_NOTINIT) {
|
||||||
|
char password[9];
|
||||||
|
char address[300];
|
||||||
|
char *host = conf_string(cf_netspool_host);
|
||||||
|
char *port = conf_string(cf_netspool_port);
|
||||||
|
if(host==NULL) {
|
||||||
|
state.netspool.state = NS_UNCONF;
|
||||||
|
} else {
|
||||||
|
snprintf(address, 299, state.node.addr.point? "%d:%d/%d.%d": "%d.%d.%d",
|
||||||
|
state.node.addr.zone, state.node.addr.net,
|
||||||
|
state.node.addr.node, state.node.addr.point);
|
||||||
|
if(state.protected) {
|
||||||
|
session_get_password(state.node.addr, password, 8);
|
||||||
|
} else {
|
||||||
|
password[0] = 0;
|
||||||
|
}
|
||||||
|
netspool_start(&state.netspool, host, port, address, password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(state.netspool_state == NS_READY) {
|
||||||
|
netspool_query(&state.netspool, "ALL");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(state.netspool_state == NS_RECEIVING) {
|
||||||
|
netspool_receive(&state.netspool);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(state.netspool_state == NS_RECVFILE) {
|
||||||
|
*dest = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +199,7 @@ int p_tx_fopen(s_protinfo *pi)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
get_next_file:
|
get_next_file:
|
||||||
if( prot_get_next_file(&ptrl, pi, &state.queue) || !ptrl )
|
if( prot_get_next_file(&ptrl, pi) || !ptrl )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Mark this file as "processed" */
|
/* Mark this file as "processed" */
|
||||||
|
@ -271,7 +271,10 @@ typedef enum {
|
|||||||
cf_debug_level,
|
cf_debug_level,
|
||||||
#endif
|
#endif
|
||||||
cf_split_inbound,
|
cf_split_inbound,
|
||||||
cf_netspool,
|
#ifdef NETSPOOL
|
||||||
|
cf_netspool_host,
|
||||||
|
cf_netspool_port,
|
||||||
|
#endif
|
||||||
BFORCE_NUMBER_OF_KEYWORDS
|
BFORCE_NUMBER_OF_KEYWORDS
|
||||||
} bforce_config_keyword;
|
} bforce_config_keyword;
|
||||||
|
|
||||||
|
20
source/include/netspool.h
Normal file
20
source/include/netspool.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#define NS_NOTINIT (0)
|
||||||
|
#define NS_UNCONF (1)
|
||||||
|
#define NS_ERROR (2)
|
||||||
|
#define NS_READY (3)
|
||||||
|
#define NS_RECEIVING (4)
|
||||||
|
#define NS_RECVFILE (5)
|
||||||
|
#define NS_CLOSED (6)
|
||||||
|
|
||||||
|
#define STRBUF (1024)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int state;
|
||||||
|
char *error;
|
||||||
|
int socket;
|
||||||
|
int filename[STRBUF];
|
||||||
|
unsigned long long length;
|
||||||
|
} s_netspool_state;
|
||||||
|
|
@ -22,6 +22,10 @@
|
|||||||
#include "outbound.h"
|
#include "outbound.h"
|
||||||
#include "prot_common.h"
|
#include "prot_common.h"
|
||||||
|
|
||||||
|
#ifdef NETSPOOL
|
||||||
|
#include "netspool.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum session {
|
typedef enum session {
|
||||||
SESSION_UNKNOWN,
|
SESSION_UNKNOWN,
|
||||||
SESSION_FTSC,
|
SESSION_FTSC,
|
||||||
@ -155,6 +159,9 @@ const s_modemport *modemport;
|
|||||||
|
|
||||||
s_falist *mailfor; /* Remote valid addresses */
|
s_falist *mailfor; /* Remote valid addresses */
|
||||||
s_fsqueue queue; /* Send files queue */
|
s_fsqueue queue; /* Send files queue */
|
||||||
|
#ifdef NETSPOOL
|
||||||
|
s_netspool_state netspool;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
typedef struct state s_state;
|
typedef struct state s_state;
|
||||||
|
|
||||||
@ -194,7 +201,7 @@ int session_check_addr(s_faddr addr);
|
|||||||
int session_get_password(s_faddr addr, char *buffer, size_t buflen);
|
int session_get_password(s_faddr addr, char *buffer, size_t buflen);
|
||||||
int session_remote_lookup(s_sysaddr *addrs, int anum);
|
int session_remote_lookup(s_sysaddr *addrs, int anum);
|
||||||
void session_remote_log_status(void);
|
void session_remote_log_status(void);
|
||||||
int session_check_password(s_faddr addr, const char *passwd);
|
/*int session_check_password(s_faddr addr, const char *passwd); seems not used*/
|
||||||
int session_set_inbound(void);
|
int session_set_inbound(void);
|
||||||
void session_set_freqs_status(void);
|
void session_set_freqs_status(void);
|
||||||
void session_set_send_options(void);
|
void session_set_send_options(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user