moved address lists to state variable

master
Sergey Dorofeev 13 years ago
parent 1aff894fc3
commit 3e9e152054

@ -68,8 +68,7 @@ int req_createsrif(char *sname, char *req, char *rsp)
else else
fprintf(fp, "Sysop SysOp\n"); fprintf(fp, "Sysop SysOp\n");
if( state.handshake && state.handshake->remote_address if( aptr = session_1remote_address() )
&& (aptr = state.handshake->remote_address(state.handshake)) )
fprintf(fp, "AKA %s\n", ftn_addrstr(abuf, *aptr)); fprintf(fp, "AKA %s\n", ftn_addrstr(abuf, *aptr));
else else
return -1; return -1;

@ -73,7 +73,7 @@ int sendstr(int s, const char *buf) {
void netspool_start(s_netspool_state *state, const char *host, const char *port, const char *address, const char *password) void netspool_start(s_netspool_state *state, const char *host, const char *port, const char *addresses, const char *password)
{ {
int s, r; int s, r;
struct addrinfo hint; struct addrinfo hint;
@ -126,9 +126,12 @@ void netspool_start(s_netspool_state *state, const char *host, const char *port,
if( r ) { state->state = NS_ERROR; state->error = "IO error"; return; } if( r ) { state->state = NS_ERROR; state->error = "IO error"; return; }
//puts(strbuf); -- hello from remote //puts(strbuf); -- hello from remote
snprintf(strbuf, STRBUF, "ADDRESS %s", address); while (*addresses) { // stop when zero length string under pointer
r = sendstr(s, strbuf); snprintf(strbuf, STRBUF, "ADDRESS %s", addresses);
if( r ) { state->state = NS_ERROR; state->error = "IO error"; return; } r = sendstr(s, strbuf);
if( r ) { state->state = NS_ERROR; state->error = "IO error"; return; }
addresses += strlen(addresses)+1; // go to next string
}
snprintf(strbuf, STRBUF, "PASSWORD %s", password); snprintf(strbuf, STRBUF, "PASSWORD %s", password);
r = sendstr(s, strbuf); r = sendstr(s, strbuf);

@ -61,7 +61,7 @@ typedef struct {
int binkp_getforsend(s_binkp_state *bstate, char *buf, int *block_type, unsigned short *block_length); int binkp_getforsend(s_binkp_state *bstate, char *buf, int *block_type, unsigned short *block_length);
int binkp_doreceiveblock(s_binkp_state *bstate, char *buf, int block_type, unsigned short block_length); int binkp_doreceiveblock(s_binkp_state *bstate, char *buf, int block_type, unsigned short block_length);
void binkp_process_NUL(s_binkp_sysinfo *remote_data, char *buffer); void binkp_process_NUL(s_binkp_sysinfo *remote_data, char *buffer);
void binkp_process_ADR(s_binkp_sysinfo *remote_data, char *buffer); void binkp_process_ADR(char *buffer);
int binkp_loop(s_binkp_state *bstate) { int binkp_loop(s_binkp_state *bstate) {
unsigned char readbuf[BINKP_HEADER+BINKP_MAXBLOCK+1]; unsigned char readbuf[BINKP_HEADER+BINKP_MAXBLOCK+1];
@ -419,20 +419,20 @@ case 2:
buf[0] = BPMSG_ADR; buf[0] = BPMSG_ADR;
wr_pos = 1; wr_pos = 1;
int i; int i;
for( i = 0; i < bstate->local_data->anum; i++ ) for( i = 0; i < state.n_localaddr; i++ )
{ {
if (i) wr_pos += sprintf(buf+wr_pos, " "); if (i) wr_pos += sprintf(buf+wr_pos, " ");
if (bstate->local_data->addrs[i].addr.point) { if (state.localaddrs[i].addr.point) {
wr_pos += sprintf(buf+wr_pos, "%d:%d/%d.%d@%s", wr_pos += sprintf(buf+wr_pos, "%d:%d/%d.%d@%s",
bstate->local_data->addrs[i].addr.zone, bstate->local_data->addrs[i].addr.net, state.localaddrs[i].addr.zone, state.localaddrs[i].addr.net,
bstate->local_data->addrs[i].addr.node, bstate->local_data->addrs[i].addr.point, state.localaddrs[i].addr.node, state.localaddrs[i].addr.point,
bstate->local_data->addrs[i].addr.domain); state.localaddrs[i].addr.domain);
} }
else { else {
wr_pos += sprintf(buf+wr_pos, "%d:%d/%d@%s", wr_pos += sprintf(buf+wr_pos, "%d:%d/%d@%s",
bstate->local_data->addrs[i].addr.zone, bstate->local_data->addrs[i].addr.net, state.localaddrs[i].addr.zone, state.localaddrs[i].addr.net,
bstate->local_data->addrs[i].addr.node, state.localaddrs[i].addr.node,
bstate->local_data->addrs[i].addr.domain); state.localaddrs[i].addr.domain);
} }
} }
*block_type = BINKP_BLK_CMD; *block_type = BINKP_BLK_CMD;
@ -635,9 +635,9 @@ case BPMSG_ADR: /* List of addresses */
return -1; return -1;
} }
if( bstate->extracmd[0] !=-1 ) return 0; // suspend !!! if( bstate->extracmd[0] !=-1 ) return 0; // suspend !!!
binkp_process_ADR(bstate->remote_data, buf+1); binkp_process_ADR(buf+1);
if( !bstate->remote_data->anum ) { if( !state.n_remoteaddr ) {
log("error: remote did not supplied any addresses"); log("error: remote did not supplied any addresses");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend if( bstate->extracmd[0] !=-1 ) return 0; // suspend
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
@ -653,9 +653,9 @@ case BPMSG_ADR: /* List of addresses */
bstate->extraislast = false; bstate->extraislast = false;
sprintf(bstate->extracmd+1,"OPT MB"); sprintf(bstate->extracmd+1,"OPT MB");
s_override ovr; s_override ovr;
for(i = 0; i < bstate->remote_data->anum; i++) { for(i = 0; i < state.n_remoteaddr; i++) {
ovr.sFlags = ""; ovr.sFlags = "";
override_get (&ovr, bstate->remote_data->addrs[i].addr, 0); override_get (&ovr, state.remoteaddrs[i].addr, 0);
if (nodelist_checkflag (ovr.sFlags, "NR")==0) { if (nodelist_checkflag (ovr.sFlags, "NR")==0) {
strcat (bstate->extracmd+1, " NR"); strcat (bstate->extracmd+1, " NR");
break; break;
@ -666,7 +666,7 @@ case BPMSG_ADR: /* List of addresses */
if (bstate->mode == bmode_outgoing_handshake) { if (bstate->mode == bmode_outgoing_handshake) {
// check that remote has the address we call // check that remote has the address we call
if( session_addrs_check_genuine(bstate->remote_data->addrs, bstate->remote_data->anum, if( session_addrs_check_genuine(state.remoteaddrs, state.n_remoteaddr,
state.node.addr) ) { state.node.addr) ) {
log("error: remote does not have the called address"); log("error: remote does not have the called address");
bstate->extracmd[0] = BPMSG_ERR; bstate->extracmd[0] = BPMSG_ERR;
@ -678,7 +678,7 @@ case BPMSG_ADR: /* List of addresses */
strncpy(bstate->remote_data->passwd, bstate->local_data->passwd, BINKP_MAXPASSWD); strncpy(bstate->remote_data->passwd, bstate->local_data->passwd, BINKP_MAXPASSWD);
bstate->remote_data->passwd[BINKP_MAXPASSWD] = '\0'; bstate->remote_data->passwd[BINKP_MAXPASSWD] = '\0';
if( session_addrs_check(bstate->remote_data->addrs, bstate->remote_data->anum, if( session_addrs_check(state.remoteaddrs, state.n_remoteaddr,
bstate->remote_data->passwd, NULL, 0) ) { bstate->remote_data->passwd, NULL, 0) ) {
log("error: Security violation"); log("error: Security violation");
bstate->extracmd[0] = BPMSG_ERR; bstate->extracmd[0] = BPMSG_ERR;
@ -715,7 +715,7 @@ case BPMSG_PWD: /* Session password */
return 1; return 1;
} }
// lock addresses // lock addresses
if( session_addrs_lock(bstate->remote_data->addrs, bstate->remote_data->anum) ) { if( session_addrs_lock(state.remoteaddrs, state.n_remoteaddr) ) {
log("error locking addresses of the remote"); log("error locking addresses of the remote");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend if extra is occupied if( bstate->extracmd[0] !=-1 ) return 0; // suspend if extra is occupied
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
@ -815,7 +815,7 @@ case BPMSG_OK: /* Password was acknowleged (data ignored) */
log("unexpected M_OK"); log("unexpected M_OK");
return -1; return -1;
} }
if (session_addrs_lock(bstate->remote_data->addrs, bstate->remote_data->anum)) { if (session_addrs_lock(state.remoteaddrs, state.n_remoteaddr)) {
log("error: unable to lock"); log("error: unable to lock");
if (bstate->extracmd[0]!=-1) return 0; if (bstate->extracmd[0]!=-1) return 0;
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
@ -1148,7 +1148,7 @@ void binkp_process_NUL(s_binkp_sysinfo *remote_data, char *buffer)
log("BinkP NUL: \"%s\"", string_printable(buffer)); // NUL cannot be invalid as it is optional info log("BinkP NUL: \"%s\"", string_printable(buffer)); // NUL cannot be invalid as it is optional info
} }
void binkp_process_ADR(s_binkp_sysinfo *remote_data, char *buffer) void binkp_process_ADR(char *buffer)
{ {
s_faddr addr; s_faddr addr;
char *p, *q; char *p, *q;
@ -1158,7 +1158,7 @@ void binkp_process_ADR(s_binkp_sysinfo *remote_data, char *buffer)
if( ftn_addrparse(&addr, p, FALSE) ) if( ftn_addrparse(&addr, p, FALSE) )
log("BinkP got unparsable address \"%s\"", string_printable(p)); log("BinkP got unparsable address \"%s\"", string_printable(p));
else else
session_addrs_add(&remote_data->addrs, &remote_data->anum, addr); session_addrs_add(&state.remoteaddrs, &state.n_remoteaddr, addr);
} }
} }
@ -1167,19 +1167,19 @@ int binkp_auth_incoming(s_binkp_sysinfo *remote_data)
if( remote_data->challenge_length > 0 if( remote_data->challenge_length > 0
&& strncmp(remote_data->passwd, "CRAM-MD5-", 9) == 0 ) && strncmp(remote_data->passwd, "CRAM-MD5-", 9) == 0 )
{ {
log("md5 auth addrs %s", remote_data->addrs); //log("md5 auth addrs %s", remote_data->addrs);
log("md5 auth anum %d", remote_data->anum); //log("md5 auth anum %d", remote_data->anum);
log("md5 auth passwd %s", remote_data->passwd + 9); //log("md5 auth passwd %s", remote_data->passwd + 9);
log("md5 auth challenge %s", remote_data->challenge); //log("md5 auth challenge %s", remote_data->challenge);
log("md5 auth challenge len %d", remote_data->challenge_length); //log("md5 auth challenge len %d", remote_data->challenge_length);
return session_addrs_check(remote_data->addrs, return session_addrs_check(state.remoteaddrs,
remote_data->anum, state.n_remoteaddr,
remote_data->passwd + 9, remote_data->passwd + 9,
remote_data->challenge, remote_data->challenge,
remote_data->challenge_length); remote_data->challenge_length);
} }
log("plain-text auth"); log("plain-text auth");
return session_addrs_check(remote_data->addrs, remote_data->anum, return session_addrs_check(state.remoteaddrs, state.n_remoteaddr,
remote_data->passwd, NULL, 0); remote_data->passwd, NULL, 0);
} }

@ -48,7 +48,7 @@ s_handshake_protocol handshake_protocol_binkp = {
binkp_incoming2, binkp_incoming2,
binkp_outgoing2, binkp_outgoing2,
/* Section 2 */ /* Section 2 */
binkp_remote_address, // binkp_remote_address,
binkp_remote_password, binkp_remote_password,
binkp_remote_sysop_name, binkp_remote_sysop_name,
binkp_remote_system_name, binkp_remote_system_name,
@ -58,7 +58,7 @@ s_handshake_protocol handshake_protocol_binkp = {
binkp_remote_mailer, binkp_remote_mailer,
NULL, NULL,
/* Section 3 */ /* Section 3 */
binkp_local_address, // binkp_local_address,
binkp_local_password binkp_local_password
}; };
@ -113,9 +113,9 @@ int binkp_incoming2(s_handshake_protocol *THIS)
rc = binkp_incoming(local_data, remote_data); rc = binkp_incoming(local_data, remote_data);
binkp_log_sysinfo(remote_data); binkp_log_sysinfo(remote_data);
if( remote_data->anum > 0 ) if( state.n_remoteaddr > 0 )
{ {
session_remote_lookup(remote_data->addrs, remote_data->anum); session_remote_lookup(state.remoteaddrs, state.n_remoteaddr);
session_remote_log_status(); session_remote_log_status();
binkp_log_options(remote_data); binkp_log_options(remote_data);
} }
@ -125,8 +125,8 @@ int binkp_incoming2(s_handshake_protocol *THIS)
/* /*
* Create mail/files queue * Create mail/files queue
*/ */
session_create_files_queue(remote_data->addrs, session_create_files_queue(state.remoteaddrs,
remote_data->anum); state.n_remoteaddr);
session_set_send_options(); session_set_send_options();
session_set_inbound(); session_set_inbound();
session_set_freqs_status(); session_set_freqs_status();
@ -155,9 +155,9 @@ int binkp_outgoing2(s_handshake_protocol *THIS)
rc = binkp_outgoing(local_data, remote_data); rc = binkp_outgoing(local_data, remote_data);
binkp_log_sysinfo(remote_data); binkp_log_sysinfo(remote_data);
if( remote_data->anum > 0 ) if( state.n_remoteaddr > 0 )
{ {
session_remote_lookup(remote_data->addrs, remote_data->anum); session_remote_lookup(state.remoteaddrs, state.n_remoteaddr);
session_remote_log_status(); session_remote_log_status();
binkp_log_options(remote_data); binkp_log_options(remote_data);
} }
@ -167,8 +167,7 @@ int binkp_outgoing2(s_handshake_protocol *THIS)
/* /*
* Create mail/files queue * Create mail/files queue
*/ */
session_create_files_queue(remote_data->addrs, session_create_files_queue(state.remoteaddrs, state.n_remoteaddr);
remote_data->anum);
session_set_send_options(); session_set_send_options();
session_set_inbound(); session_set_inbound();
} }
@ -176,7 +175,7 @@ int binkp_outgoing2(s_handshake_protocol *THIS)
return rc; return rc;
} }
s_faddr *binkp_remote_address(s_handshake_protocol *THIS) /*s_faddr *binkp_remote_address(s_handshake_protocol *THIS)
{ {
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->remote_data); ASSERT(THIS->remote_data);
@ -185,7 +184,7 @@ s_faddr *binkp_remote_address(s_handshake_protocol *THIS)
return &((s_binkp_sysinfo *)THIS->remote_data)->addrs[0].addr; return &((s_binkp_sysinfo *)THIS->remote_data)->addrs[0].addr;
return NULL; return NULL;
} } */
char *binkp_remote_password(s_handshake_protocol *THIS) char *binkp_remote_password(s_handshake_protocol *THIS)
{ {
@ -264,7 +263,7 @@ char *binkp_remote_mailer(s_handshake_protocol *THIS)
return NULL; return NULL;
} }
s_faddr *binkp_local_address(s_handshake_protocol *THIS) /*s_faddr *binkp_local_address(s_handshake_protocol *THIS)
{ {
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->local_data); ASSERT(THIS->local_data);
@ -273,7 +272,7 @@ s_faddr *binkp_local_address(s_handshake_protocol *THIS)
return &((s_binkp_sysinfo *)THIS->local_data)->addrs[0].addr; return &((s_binkp_sysinfo *)THIS->local_data)->addrs[0].addr;
return NULL; return NULL;
} } */
char *binkp_local_password(s_handshake_protocol *THIS) char *binkp_local_password(s_handshake_protocol *THIS)
{ {

@ -146,11 +146,9 @@ void binkp_log_sysinfo(s_binkp_sysinfo *binkp)
int i; int i;
char abuf[BF_MAXADDRSTR+1]; char abuf[BF_MAXADDRSTR+1];
if( binkp->anum ) for( i = 0; i < state.n_remoteaddr; i++ ) {
for( i = 0; i < binkp->anum; i++ ) log(" Address : %s", ftn_addrstr(abuf, state.remoteaddrs[i].addr));
{ }
log(" Address : %s", ftn_addrstr(abuf, binkp->addrs[i].addr));
}
if( *binkp->systname && *binkp->phone ) if( *binkp->systname && *binkp->phone )
log(" System : %s (%s)", log(" System : %s (%s)",
@ -220,25 +218,21 @@ void binkp_set_sysinfo(s_binkp_sysinfo *binkp, s_faddr *remote_addr, bool caller
const char *p_flags = conf_string(cf_flags); const char *p_flags = conf_string(cf_flags);
/* free previously allocated memory */ /* free previously allocated memory */
if( binkp->addrs ) // if( binkp->addrs )
free(binkp->addrs); // free(binkp->addrs);
memset(binkp, '\0', sizeof(s_binkp_sysinfo)); memset(binkp, '\0', sizeof(s_binkp_sysinfo));
/* Set best primary address */ /* Set best primary address */
if( remote_addr ) if(remote_addr) {
{
primary = session_get_bestaka(*remote_addr); primary = session_get_bestaka(*remote_addr);
/* Add primary address */ /* Add primary address */
if( primary ) if (primary) session_addrs_add(&state.localaddrs, &state.n_localaddr, *primary);
session_addrs_add(&binkp->addrs, &binkp->anum, *primary);
} }
/* Add other AKAs */ /* Add other AKAs */
for( addr_ptr = conf_first(cf_address); addr_ptr; for( addr_ptr = conf_first(cf_address); addr_ptr; addr_ptr = conf_next(addr_ptr) ) {
addr_ptr = conf_next(addr_ptr) )
{
for( hide_ptr = conf_first(cf_hide_our_aka); hide_ptr; for( hide_ptr = conf_first(cf_hide_our_aka); hide_ptr;
hide_ptr = conf_next(hide_ptr) ) hide_ptr = conf_next(hide_ptr) )
{ {
@ -247,12 +241,11 @@ void binkp_set_sysinfo(s_binkp_sysinfo *binkp, s_faddr *remote_addr, bool caller
} }
if( !hide_ptr && primary != &addr_ptr->d.falist.addr ) if( !hide_ptr && primary != &addr_ptr->d.falist.addr )
session_addrs_add(&binkp->addrs, &binkp->anum, session_addrs_add(&state.localaddrs, &state.n_localaddr,
addr_ptr->d.falist.addr); addr_ptr->d.falist.addr);
} }
if( binkp->anum == 0 ) if (state.n_localaddr == 0) log("warning: no addresses will be presented to remote");
log("warning: no addresses will be presented to remote");
/* session password */ /* session password */
if( caller ) if( caller )

@ -41,12 +41,13 @@ const char *Protocols[] =
* 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_filehint *hint) static int prot_get_next_file(s_filelist **dest, s_protinfo *pi)
{ {
log("prot_get_next_file"); // %s %d", hint->fn, hint->sz); log("prot_get_next_file"); // %s %d", hint->fn, hint->sz);
s_filelist *ptrl = NULL; s_filelist *ptrl = NULL;
s_filelist *best = NULL; s_filelist *best = NULL;
s_fsqueue *q = &state.queue; s_fsqueue *q = &state.queue;
s_filehint *hint = NULL; // M_GET hinting does not work good here as it spec net_name and it is unknown here (especially for PKTs)
*dest = NULL; *dest = NULL;
@ -116,24 +117,48 @@ static int prot_get_next_file(s_filelist **dest, s_protinfo *pi, s_filehint *hin
/*log("netspool next file");*/ /*log("netspool next file");*/
if(state.netspool.state == NS_NOTINIT) { if(state.netspool.state == NS_NOTINIT) {
/*log("new netspool connection");*/ /*log("new netspool connection");*/
char password[100]; #define ADDRBUF 3000
char address[300]; #define SMALLBUF 128
char password[SMALLBUF];
char address[SMALLBUF];
char addresses[ADDRBUF];
int i, pos, alen;
char *host = conf_string(cf_netspool_host); char *host = conf_string(cf_netspool_host);
char *port = conf_string(cf_netspool_port); char *port = conf_string(cf_netspool_port);
if(host==NULL) { if(host==NULL) {
//log("netspool is not configured"); //log("netspool is not configured");
state.netspool.state = NS_UNCONF; state.netspool.state = NS_UNCONF;
} else { } else {
snprintf(address, 299, state.node.addr.point? "%d:%d/%d.%d": "%d:%d/%d", if (state.n_remoteaddr==0) {
state.node.addr.zone, state.node.addr.net, log("cannot start netspool: list of remote addresses has zero length");
state.node.addr.node, state.node.addr.point); return -1;
}
for(i=0, pos=0; i<state.n_remoteaddr; i++) {
alen=snprintf(address, SMALLBUF, state.remoteaddrs[i].addr.point? "%d:%d/%d.%d": "%d:%d/%d",
state.remoteaddrs[i].addr.zone, state.remoteaddrs[i].addr.net,
state.remoteaddrs[i].addr.node, state.remoteaddrs[i].addr.point);
if (!state.remoteaddrs[i].good) {
log("ignoring addr %s", address);
continue;
}
if (pos+alen+1 > ADDRBUF-1) { // space for zero length string as end marker
log("no buffer space for address %s", address);
break;
}
log("add address %s", address);
memcpy (addresses+pos, address, alen);
pos += alen;
addresses[pos++] = 0;
}
addresses[pos++] = 0;
if(state.protected) { if(state.protected) {
session_get_password(state.node.addr, password, 100); session_get_password(state.remoteaddrs[0].addr, password, SMALLBUF);
} else { } else {
password[0] = 0; password[0] = 0;
} }
log("netspool start %s %s %s (pwd)", host, port, address); log("netspool start %s %s", host, port);
netspool_start(&state.netspool, host, port, address, password); netspool_start(&state.netspool, host, port, addresses, password);
} }
} }
@ -257,7 +282,7 @@ int p_tx_fopen(s_protinfo *pi, s_filehint *hint)
} }
get_next_file: get_next_file:
if( prot_get_next_file(&ptrl, pi, hint) ) { if( prot_get_next_file(&ptrl, pi) ) {
log("no next file"); log("no next file");
return 1; return 1;
} }

@ -610,7 +610,7 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
const char *p_emsifr = conf_string(cf_emsi_FR_time); const char *p_emsifr = conf_string(cf_emsi_FR_time);
/* free previously allocated memory */ /* free previously allocated memory */
if( emsi->addrs ) free(emsi->addrs); // if( emsi->addrs ) free(emsi->addrs);
memset(emsi, '\0', sizeof(s_emsi)); memset(emsi, '\0', sizeof(s_emsi));
@ -624,7 +624,7 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
/* Add primary address */ /* Add primary address */
if( primary ) if( primary )
session_addrs_add(&emsi->addrs, &emsi->anum, *primary); session_addrs_add(&state.localaddrs, &state.n_localaddr, *primary);
/* Add other AKAs */ /* Add other AKAs */
for( addr_ptr = conf_first(cf_address); addr_ptr; for( addr_ptr = conf_first(cf_address); addr_ptr;
@ -638,11 +638,11 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
} }
if( !hide_ptr && primary != &addr_ptr->d.falist.addr ) if( !hide_ptr && primary != &addr_ptr->d.falist.addr )
session_addrs_add(&emsi->addrs, &emsi->anum, session_addrs_add(&state.localaddrs, &state.n_localaddr,
addr_ptr->d.falist.addr); addr_ptr->d.falist.addr);
} }
if( emsi->anum == 0 ) if( state.localaddrs == 0 )
log("warning: no addresses will be presented to remote"); log("warning: no addresses will be presented to remote");
/* session password */ /* session password */

@ -24,7 +24,7 @@ void emsi_init(s_handshake_protocol *THIS);
void emsi_deinit(s_handshake_protocol *THIS); void emsi_deinit(s_handshake_protocol *THIS);
int emsi_incoming(s_handshake_protocol *THIS); int emsi_incoming(s_handshake_protocol *THIS);
int emsi_outgoing(s_handshake_protocol *THIS); int emsi_outgoing(s_handshake_protocol *THIS);
s_faddr *emsi_remote_address(s_handshake_protocol *THIS); //s_faddr *emsi_remote_address(s_handshake_protocol *THIS);
char *emsi_remote_password(s_handshake_protocol *THIS); char *emsi_remote_password(s_handshake_protocol *THIS);
char *emsi_remote_sysop_name(s_handshake_protocol *THIS); char *emsi_remote_sysop_name(s_handshake_protocol *THIS);
char *emsi_remote_system_name(s_handshake_protocol *THIS); char *emsi_remote_system_name(s_handshake_protocol *THIS);
@ -33,7 +33,7 @@ char *emsi_remote_phone(s_handshake_protocol *THIS);
char *emsi_remote_flags(s_handshake_protocol *THIS); char *emsi_remote_flags(s_handshake_protocol *THIS);
char *emsi_remote_mailer(s_handshake_protocol *THIS); char *emsi_remote_mailer(s_handshake_protocol *THIS);
int emsi_remote_traffic(s_handshake_protocol *THIS, s_traffic *dest); int emsi_remote_traffic(s_handshake_protocol *THIS, s_traffic *dest);
s_faddr *emsi_local_address(s_handshake_protocol *THIS); //s_faddr *emsi_local_address(s_handshake_protocol *THIS);
char *emsi_local_password(s_handshake_protocol *THIS); char *emsi_local_password(s_handshake_protocol *THIS);
s_handshake_protocol handshake_protocol_emsi = { s_handshake_protocol handshake_protocol_emsi = {
@ -49,7 +49,7 @@ s_handshake_protocol handshake_protocol_emsi = {
emsi_incoming, emsi_incoming,
emsi_outgoing, emsi_outgoing,
/* Section 2 */ /* Section 2 */
emsi_remote_address, // emsi_remote_address,
emsi_remote_password, emsi_remote_password,
emsi_remote_sysop_name, emsi_remote_sysop_name,
emsi_remote_system_name, emsi_remote_system_name,
@ -59,7 +59,7 @@ s_handshake_protocol handshake_protocol_emsi = {
emsi_remote_mailer, emsi_remote_mailer,
emsi_remote_traffic, emsi_remote_traffic,
/* Section 3 */ /* Section 3 */
emsi_local_address, // emsi_local_address,
emsi_local_password emsi_local_password
}; };
@ -151,7 +151,7 @@ int emsi_incoming(s_handshake_protocol *THIS)
/* /*
* Check password(s) * Check password(s)
*/ */
if( session_addrs_check(remote_emsi->addrs, remote_emsi->anum, if( session_addrs_check(state.remoteaddrs, state.n_remoteaddr,
remote_emsi->passwd, NULL, 0) ) remote_emsi->passwd, NULL, 0) )
{ {
rc = HRC_BAD_PASSWD; rc = HRC_BAD_PASSWD;
@ -161,7 +161,7 @@ int emsi_incoming(s_handshake_protocol *THIS)
else else
{ {
/* Lock (create BSY) remote addresses */ /* Lock (create BSY) remote addresses */
if( session_addrs_lock(remote_emsi->addrs, remote_emsi->anum) ) if( session_addrs_lock(state.remoteaddrs, state.n_remoteaddr) )
{ {
log("all remote addresses are busy"); log("all remote addresses are busy");
rc = HRC_BUSY; rc = HRC_BUSY;
@ -172,7 +172,7 @@ int emsi_incoming(s_handshake_protocol *THIS)
* We know caller's address so we can process * We know caller's address so we can process
* more expressions and fill state.node structure.. * more expressions and fill state.node structure..
*/ */
session_remote_lookup(remote_emsi->addrs, remote_emsi->anum); session_remote_lookup(state.remoteaddrs, state.n_remoteaddr);
if( session_check_speed() ) if( session_check_speed() )
rc = HRC_LOW_SPEED; rc = HRC_LOW_SPEED;
@ -219,8 +219,8 @@ int emsi_incoming(s_handshake_protocol *THIS)
/* /*
* Create mail/files queue * Create mail/files queue
*/ */
session_create_files_queue(remote_emsi->addrs, session_create_files_queue(state.remoteaddrs,
remote_emsi->anum); state.n_remoteaddr);
/* /*
* Set FREQ processor status * Set FREQ processor status
@ -290,21 +290,21 @@ int emsi_outgoing(s_handshake_protocol *THIS)
/* /*
* Make sure expected address was presented * Make sure expected address was presented
*/ */
if( session_addrs_check_genuine(remote_emsi->addrs, if( session_addrs_check_genuine(state.remoteaddrs,
remote_emsi->anum, state.node.addr) ) state.n_remoteaddr, state.node.addr) )
return HRC_NO_ADDRESS; return HRC_NO_ADDRESS;
/* /*
* Check password(s) * Check password(s)
*/ */
if( session_addrs_check(remote_emsi->addrs, remote_emsi->anum, if( session_addrs_check(state.remoteaddrs, state.n_remoteaddr,
remote_emsi->passwd, NULL, 0) ) remote_emsi->passwd, NULL, 0) )
return HRC_BAD_PASSWD; return HRC_BAD_PASSWD;
/* /*
* Lock (create BSY) remote addresses * Lock (create BSY) remote addresses
*/ */
(void)session_addrs_lock(remote_emsi->addrs, remote_emsi->anum); (void)session_addrs_lock(state.remoteaddrs, state.n_remoteaddr);
/* /*
* Set protocol we will use ("options" ignored) * Set protocol we will use ("options" ignored)
@ -341,13 +341,12 @@ int emsi_outgoing(s_handshake_protocol *THIS)
/* /*
* Create mail/files queue * Create mail/files queue
*/ */
session_create_files_queue(remote_emsi->addrs, session_create_files_queue(state.remoteaddrs, state.n_remoteaddr);
remote_emsi->anum);
return HRC_OK; return HRC_OK;
} }
s_faddr *emsi_remote_address(s_handshake_protocol *THIS) /*s_faddr *emsi_remote_address(s_handshake_protocol *THIS)
{ {
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->remote_data); ASSERT(THIS->remote_data);
@ -356,7 +355,7 @@ s_faddr *emsi_remote_address(s_handshake_protocol *THIS)
return &((s_emsi *)THIS->remote_data)->addrs[0].addr; return &((s_emsi *)THIS->remote_data)->addrs[0].addr;
return NULL; return NULL;
} } */
char *emsi_remote_password(s_handshake_protocol *THIS) char *emsi_remote_password(s_handshake_protocol *THIS)
{ {
@ -456,7 +455,7 @@ int emsi_remote_traffic(s_handshake_protocol *THIS, s_traffic *dest)
return -1; return -1;
} }
s_faddr *emsi_local_address(s_handshake_protocol *THIS) /*s_faddr *emsi_local_address(s_handshake_protocol *THIS)
{ {
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->local_data); ASSERT(THIS->local_data);
@ -465,7 +464,7 @@ s_faddr *emsi_local_address(s_handshake_protocol *THIS)
return &((s_emsi *)THIS->local_data)->addrs[0].addr; return &((s_emsi *)THIS->local_data)->addrs[0].addr;
return NULL; return NULL;
} } */
char *emsi_local_password(s_handshake_protocol *THIS) char *emsi_local_password(s_handshake_protocol *THIS)
{ {

@ -116,10 +116,10 @@ char *emsi_createdat(s_emsi *emsi)
/* our addresses, akas, etc :) */ /* our addresses, akas, etc :) */
tmp = add_char(tmp, '{'); tmp = add_char(tmp, '{');
for( i = 0; i < emsi->anum; i++ ) for( i = 0; i < state.n_localaddr; i++ )
{ {
if( i ) tmp = add_char(tmp, ' '); if( i ) tmp = add_char(tmp, ' ');
tmp = add_str(tmp, ftn_addrstr(abuf, emsi->addrs[i].addr)); tmp = add_str(tmp, ftn_addrstr(abuf, state.localaddrs[i].addr));
} }
tmp = add_char(tmp, '}'); tmp = add_char(tmp, '}');
@ -146,27 +146,27 @@ char *emsi_createdat(s_emsi *emsi)
if( emsi->linkcodes.FNC ) tmp = add_str(tmp, "FNC,"); if( emsi->linkcodes.FNC ) tmp = add_str(tmp, "FNC,");
if( emsi->linkcodes.RMA ) tmp = add_str(tmp, "RMA,"); if( emsi->linkcodes.RMA ) tmp = add_str(tmp, "RMA,");
if( emsi->linkcodes.RH1 ) tmp = add_str(tmp, "RH1,"); if( emsi->linkcodes.RH1 ) tmp = add_str(tmp, "RH1,");
for( i = 0; i < emsi->anum; i++ ) for( i = 0; i < state.n_localaddr; i++ )
{ {
if( emsi->addrs[i].flags & EMSI_FLAG_PU ) if( state.localaddrs[i].flags & EMSI_FLAG_PU )
tmp = add_nflag(tmp, "PU", i); tmp = add_nflag(tmp, "PU", i);
if( emsi->addrs[i].flags & EMSI_FLAG_HA ) if( state.localaddrs[i].flags & EMSI_FLAG_HA )
tmp = add_nflag(tmp, "HA", i); tmp = add_nflag(tmp, "HA", i);
if( emsi->addrs[i].flags & EMSI_FLAG_PM ) if( state.localaddrs[i].flags & EMSI_FLAG_PM )
tmp = add_nflag(tmp, "PM", i); tmp = add_nflag(tmp, "PM", i);
if( emsi->addrs[i].flags & EMSI_FLAG_NF ) if( state.localaddrs[i].flags & EMSI_FLAG_NF )
tmp = add_nflag(tmp, "NF", i); tmp = add_nflag(tmp, "NF", i);
if( emsi->addrs[i].flags & EMSI_FLAG_NX ) if( state.localaddrs[i].flags & EMSI_FLAG_NX )
tmp = add_nflag(tmp, "NX", i); tmp = add_nflag(tmp, "NX", i);
if( emsi->addrs[i].flags & EMSI_FLAG_NR ) if( state.localaddrs[i].flags & EMSI_FLAG_NR )
tmp = add_nflag(tmp, "NR", i); tmp = add_nflag(tmp, "NR", i);
if( emsi->addrs[i].flags & EMSI_FLAG_HN ) if( state.localaddrs[i].flags & EMSI_FLAG_HN )
tmp = add_nflag(tmp, "HN", i); tmp = add_nflag(tmp, "HN", i);
if( emsi->addrs[i].flags & EMSI_FLAG_HX ) if( state.localaddrs[i].flags & EMSI_FLAG_HX )
tmp = add_nflag(tmp, "HX", i); tmp = add_nflag(tmp, "HX", i);
if( emsi->addrs[i].flags & EMSI_FLAG_HF ) if( state.localaddrs[i].flags & EMSI_FLAG_HF )
tmp = add_nflag(tmp, "HF", i); tmp = add_nflag(tmp, "HF", i);
if( emsi->addrs[i].flags & EMSI_FLAG_HR ) if( state.localaddrs[i].flags & EMSI_FLAG_HR )
tmp = add_nflag(tmp, "HR", i); tmp = add_nflag(tmp, "HR", i);
} }
if( tmp[strlen(tmp+1)] == ',' ) if( tmp[strlen(tmp+1)] == ',' )
@ -468,10 +468,10 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
if( ftn_addrparse(&addr, p, FALSE) ) if( ftn_addrparse(&addr, p, FALSE) )
log("unparsable address \"%s\" skipped", p); log("unparsable address \"%s\" skipped", p);
else else
session_addrs_add(&emsi->addrs, &emsi->anum, addr); session_addrs_add(&state.remoteaddrs, &state.n_remoteaddr, addr);
} }
if( emsi->anum == 0 ) if( state.n_remoteaddr == 0 )
{ {
log("parsable addresses not found"); log("parsable addresses not found");
return(1); return(1);
@ -502,24 +502,24 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
else if( !strcmp(p, "RMA") ) emsi->linkcodes.RMA = 1; else if( !strcmp(p, "RMA") ) emsi->linkcodes.RMA = 1;
else if( !strcmp(p, "RH1") ) emsi->linkcodes.RH1 = 1; else if( !strcmp(p, "RH1") ) emsi->linkcodes.RH1 = 1;
/* check EMSI-II address dependend flags */ /* check EMSI-II address dependend flags */
else if( ((i=nflgcmp(p, "HA")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "HA")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_HA; state.remoteaddrs[i].flags |= EMSI_FLAG_HA;
else if( ((i=nflgcmp(p, "PM")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "PM")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_PM; state.remoteaddrs[i].flags |= EMSI_FLAG_PM;
else if( ((i=nflgcmp(p, "NF")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "NF")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_NF; state.remoteaddrs[i].flags |= EMSI_FLAG_NF;
else if( ((i=nflgcmp(p, "NX")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "NX")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_NX; state.remoteaddrs[i].flags |= EMSI_FLAG_NX;
else if( ((i=nflgcmp(p, "NR")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "NR")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_NR; state.remoteaddrs[i].flags |= EMSI_FLAG_NR;
else if( ((i=nflgcmp(p, "HN")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "HN")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_HN; state.remoteaddrs[i].flags |= EMSI_FLAG_HN;
else if( ((i=nflgcmp(p, "HX")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "HX")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_HX; state.remoteaddrs[i].flags |= EMSI_FLAG_HX;
else if( ((i=nflgcmp(p, "HF")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "HF")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_HF; state.remoteaddrs[i].flags |= EMSI_FLAG_HF;
else if( ((i=nflgcmp(p, "HR")) >= 0) && (i < emsi->anum) ) else if( ((i=nflgcmp(p, "HR")) >= 0) && (i < state.n_remoteaddr) )
emsi->addrs[i].flags |= EMSI_FLAG_HR; state.remoteaddrs[i].flags |= EMSI_FLAG_HR;
} }
/* compatibility codes */ /* compatibility codes */
@ -670,14 +670,14 @@ void emsi_logdat(s_emsi *emsi)
if( emsi->have_emsi ) if( emsi->have_emsi )
{ {
if( emsi->anum ) if( state.n_remoteaddr )
{ {
for( i = 0; i < emsi->anum; i++ ) for( i = 0; i < state.n_remoteaddr; i++ )
{ {
if( emsi->addrs[i].busy ) if( state.remoteaddrs[i].busy )
log(" Address : %s (Busy)", ftn_addrstr(abuf, emsi->addrs[i].addr)); log(" Address : %s (Busy)", ftn_addrstr(abuf, state.remoteaddrs[i].addr));
else else
log(" Address : %s", ftn_addrstr(abuf, emsi->addrs[i].addr)); log(" Address : %s", ftn_addrstr(abuf, state.remoteaddrs[i].addr));
} }
} }
else else

@ -64,35 +64,35 @@ static int yoohoo_getword(const char *buf)
* Return value: * Return value:
* None * None
*/ */
static void yoohoo_put_hello(char *buffer, s_yoohoo_sysinfo *hello) static void yoohoo_put_hello(char *buffer, s_yoohoo_sysinfo *myhello)
{ {
char *p, *q; char *p, *q;
ASSERT(buffer && hello); ASSERT(buffer && myhello);
memset(buffer, '\0', YOOHOO_HELLOLEN); memset(buffer, '\0', YOOHOO_HELLOLEN);
p = buffer; p = buffer;
p = yoohoo_putword(p, 0x6f); p = yoohoo_putword(p, 0x6f);
p = yoohoo_putword(p, 0x01); /* Hello version */ p = yoohoo_putword(p, 0x01); /* Hello version */
p = yoohoo_putword(p, hello->product_code); /* Product code */ p = yoohoo_putword(p, myhello->product_code); /* Product code */
p = yoohoo_putword(p, hello->version_maj); /* Major version */ p = yoohoo_putword(p, myhello->version_maj); /* Major version */
p = yoohoo_putword(p, hello->version_min); /* Minor version */ p = yoohoo_putword(p, myhello->version_min); /* Minor version */
strnxcpy(p, hello->system, 60); /* Node name */ strnxcpy(p, myhello->system, 60); /* Node name */
/* /*
* Add domain after the end of 'Node name' * Add domain after the end of 'Node name'
* TODO: check it for buffer overflows %-I * TODO: check it for buffer overflows %-I
*/ */
if( hello->anum > 0 && hello->addrs[0].addr.domain if( state.n_localaddr > 0 && state.localaddrs[0].addr.domain
&& *hello->addrs[0].addr.domain ) && *state.localaddrs[0].addr.domain )
{ {
char *q; char *q;
if( strlen(hello->system) + strlen(hello->addrs[0].addr.domain) > 57 ) if( strlen(myhello->system) + strlen(state.localaddrs[0].addr.domain) > 57 )
{ {
if( strlen(hello->addrs[0].addr.domain) < 60 ) if( strlen(state.localaddrs[0].addr.domain) < 60 )
q = p + (60 - strlen(hello->addrs[0].addr.domain)); q = p + (60 - strlen(state.localaddrs[0].addr.domain));
else else
q = p; q = p;
@ -100,29 +100,29 @@ static void yoohoo_put_hello(char *buffer, s_yoohoo_sysinfo *hello)
} }
else else
{ {
q = p + strlen(hello->system) + 1; q = p + strlen(myhello->system) + 1;
} }
strnxcpy(q, hello->addrs[0].addr.domain, 60-(q-p)); strnxcpy(q, state.localaddrs[0].addr.domain, 60-(q-p));
} }
p += 60; p += 60;
strnxcpy(p, hello->sysop, 20); /* SysOp name */ strnxcpy(p, myhello->sysop, 20); /* SysOp name */
p += 20; p += 20;
if( hello->anum > 0 ) if( state.n_localaddr > 0 )
{ {
p = yoohoo_putword(p, hello->addrs[0].addr.zone); p = yoohoo_putword(p, state.localaddrs[0].addr.zone);
p = yoohoo_putword(p, hello->addrs[0].addr.net); p = yoohoo_putword(p, state.localaddrs[0].addr.net);
p = yoohoo_putword(p, hello->addrs[0].addr.node); p = yoohoo_putword(p, state.localaddrs[0].addr.node);
p = yoohoo_putword(p, hello->addrs[0].addr.point); p = yoohoo_putword(p, state.localaddrs[0].addr.point);
} }
else else
p += 8; p += 8;
strncpy(p, hello->passwd, 8); /* Session password */ strncpy(p, myhello->passwd, 8); /* Session password */
p += 8; p += 8;
p += 8; /* Reserved 8 bytes */ p += 8; /* Reserved 8 bytes */
p = yoohoo_putword(p, hello->capabilities); /* Capabilities */ p = yoohoo_putword(p, myhello->capabilities); /* Capabilities */
p += 12; /* Reserved 12 bytes */ p += 12; /* Reserved 12 bytes */
#ifdef DEBUG #ifdef DEBUG
@ -145,11 +145,11 @@ static void yoohoo_put_hello(char *buffer, s_yoohoo_sysinfo *hello)
* Return value: * Return value:
* None * None
*/ */
static int yoohoo_get_hello(s_yoohoo_sysinfo *hello, const char *buffer) static int yoohoo_get_hello(s_yoohoo_sysinfo *remhello, const char *buffer)
{ {
s_faddr addr; s_faddr addr;
ASSERT(buffer && hello); ASSERT(buffer && remhello);
#ifdef DEBUG #ifdef DEBUG
{ {
@ -159,16 +159,16 @@ static int yoohoo_get_hello(s_yoohoo_sysinfo *hello, const char *buffer)
} }
#endif #endif
memset(hello, '\0', sizeof(s_yoohoo_sysinfo)); memset(remhello, '\0', sizeof(s_yoohoo_sysinfo));
if( yoohoo_getword(buffer+2) != 0x01 ) if( yoohoo_getword(buffer+2) != 0x01 )
log("YooHoo hello version is %d!", yoohoo_getword(buffer+2)); log("YooHoo hello version is %d!", yoohoo_getword(buffer+2));
hello->product_code = yoohoo_getword(buffer+4); remhello->product_code = yoohoo_getword(buffer+4);
hello->version_maj = yoohoo_getword(buffer+6); remhello->version_maj = yoohoo_getword(buffer+6);
hello->version_min = yoohoo_getword(buffer+8); remhello->version_min = yoohoo_getword(buffer+8);
strnxcpy(hello->system, buffer+10, MIN(sizeof(hello->system),60+1)); strnxcpy(remhello->system, buffer+10, MIN(sizeof(remhello->system),60+1));
strnxcpy(hello->sysop, buffer+70, MIN(sizeof(hello->sysop),20+1)); strnxcpy(remhello->sysop, buffer+70, MIN(sizeof(remhello->sysop),20+1));
/* /*
* Extract address * Extract address
@ -178,11 +178,11 @@ static int yoohoo_get_hello(s_yoohoo_sysinfo *hello, const char *buffer)
addr.net = yoohoo_getword(buffer+92); addr.net = yoohoo_getword(buffer+92);
addr.node = yoohoo_getword(buffer+94); addr.node = yoohoo_getword(buffer+94);
addr.point = yoohoo_getword(buffer+96); addr.point = yoohoo_getword(buffer+96);
session_addrs_add(&hello->addrs, &hello->anum, addr); session_addrs_add(&state.remoteaddrs, &state.n_remoteaddr, addr);
strnxcpy(hello->passwd, buffer+98, MIN(sizeof(hello->passwd),8+1)); strnxcpy(remhello->passwd, buffer+98, MIN(sizeof(remhello->passwd),8+1));
/* Reserved 8 bytes */ /* Reserved 8 bytes */
hello->capabilities = yoohoo_getword(buffer+114); remhello->capabilities = yoohoo_getword(buffer+114);
/* Reserved 12 bytes */ /* Reserved 12 bytes */
return 0; return 0;
@ -466,11 +466,11 @@ void yoohoo_set_sysinfo(s_yoohoo_sysinfo *local_data, int hrc,
* Set our local address * Set our local address
*/ */
if( primary ) if( primary )
session_addrs_add(&local_data->addrs, &local_data->anum, *primary); session_addrs_add(&state.localaddrs, &state.n_localaddr, *primary);
else if( (addr_ptr = conf_first(cf_address)) ) else if( (addr_ptr = conf_first(cf_address)) )
session_addrs_add(&local_data->addrs, &local_data->anum, addr_ptr->d.falist.addr); session_addrs_add(&state.localaddrs, &state.n_localaddr, addr_ptr->d.falist.addr);
if( !local_data->anum ) if( !state.n_localaddr )
log("warning: no addresses will be presented to remote"); log("warning: no addresses will be presented to remote");
/* /*
@ -557,35 +557,35 @@ void yoohoo_set_sysinfo(s_yoohoo_sysinfo *local_data, int hrc,
* Return value: * Return value:
* None * None
*/ */
void yoohoo_log_sysinfo(s_yoohoo_sysinfo *yoohoo) void yoohoo_log_sysinfo(s_yoohoo_sysinfo *remyoohoo)
{ {
int i; int i;
char abuf[BF_MAXADDRSTR+1]; char abuf[BF_MAXADDRSTR+1];
if( yoohoo->anum ) if( state.n_remoteaddr )
for( i = 0; i < yoohoo->anum; i++ ) for( i = 0; i < state.n_remoteaddr; i++ )
{ {
log(" Address : %s", ftn_addrstr(abuf, yoohoo->addrs[i].addr)); log(" Address : %s", ftn_addrstr(abuf, state.remoteaddrs[i].addr));
} }
else else
log(" Address : <none>"); log(" Address : <none>");
if( yoohoo->system[0] ) if( remyoohoo->system[0] )
log(" System : %s", string_printable(yoohoo->system)); log(" System : %s", string_printable(remyoohoo->system));
#ifdef BFORCE_LOG_PASSWD #ifdef BFORCE_LOG_PASSWD
if( yoohoo->passwd[0] ) if( remyoohoo->passwd[0] )
log(" Password : %s", string_printable(yoohoo->passwd)); log(" Password : %s", string_printable(remyoohoo->passwd));
#endif #endif
if( yoohoo->sysop[0] ) if( remyoohoo->sysop[0] )
log(" SysOp : %s", string_printable(yoohoo->sysop)); log(" SysOp : %s", string_printable(remyoohoo->sysop));
if( yoohoo->product_code || yoohoo->version_maj || yoohoo->version_min ) if( remyoohoo->product_code || remyoohoo->version_maj || remyoohoo->version_min )
{ {
log(" Mailer : %s [%02x] %d.%d", log(" Mailer : %s [%02x] %d.%d",
"?", yoohoo->product_code, "?", remyoohoo->product_code,
yoohoo->version_maj, yoohoo->version_min); remyoohoo->version_maj, remyoohoo->version_min);
} }
} }

@ -24,7 +24,7 @@ void yoohoo_init(s_handshake_protocol *THIS);
void yoohoo_deinit(s_handshake_protocol *THIS); void yoohoo_deinit(s_handshake_protocol *THIS);
int yoohoo_incoming(s_handshake_protocol *THIS); int yoohoo_incoming(s_handshake_protocol *THIS);
int yoohoo_outgoing(s_handshake_protocol *THIS); int yoohoo_outgoing(s_handshake_protocol *THIS);
s_faddr *yoohoo_remote_address(s_handshake_protocol *THIS); //s_faddr *yoohoo_remote_address(s_handshake_protocol *THIS);
char *yoohoo_remote_password(s_handshake_protocol *THIS); char *yoohoo_remote_password(s_handshake_protocol *THIS);
char *yoohoo_remote_sysop_name(s_handshake_protocol *THIS); char *yoohoo_remote_sysop_name(s_handshake_protocol *THIS);
char *yoohoo_remote_system_name(s_handshake_protocol *THIS); char *yoohoo_remote_system_name(s_handshake_protocol *THIS);
@ -32,7 +32,7 @@ char *yoohoo_remote_location(s_handshake_protocol *THIS);
char *yoohoo_remote_phone(s_handshake_protocol *THIS); char *yoohoo_remote_phone(s_handshake_protocol *THIS);
char *yoohoo_remote_flags(s_handshake_protocol *THIS); char *yoohoo_remote_flags(s_handshake_protocol *THIS);
char *yoohoo_remote_mailer(s_handshake_protocol *THIS); char *yoohoo_remote_mailer(s_handshake_protocol *THIS);
s_faddr *yoohoo_local_address(s_handshake_protocol *THIS); //s_faddr *yoohoo_local_address(s_handshake_protocol *THIS);
char *yoohoo_local_password(s_handshake_protocol *THIS); char *yoohoo_local_password(s_handshake_protocol *THIS);
s_handshake_protocol handshake_protocol_yoohoo = { s_handshake_protocol handshake_protocol_yoohoo = {
@ -48,7 +48,7 @@ s_handshake_protocol handshake_protocol_yoohoo = {
yoohoo_incoming, yoohoo_incoming,
yoohoo_outgoing, yoohoo_outgoing,
/* Section 2 */ /* Section 2 */
yoohoo_remote_address, // yoohoo_remote_address,
yoohoo_remote_password, yoohoo_remote_password,
yoohoo_remote_sysop_name, yoohoo_remote_sysop_name,
yoohoo_remote_system_name, yoohoo_remote_system_name,
@ -58,7 +58,7 @@ s_handshake_protocol handshake_protocol_yoohoo = {
NULL, NULL,
NULL, NULL,
/* Section 3 */ /* Section 3 */
yoohoo_local_address, // yoohoo_local_address,
yoohoo_local_password yoohoo_local_password
}; };
@ -113,7 +113,7 @@ int yoohoo_incoming(s_handshake_protocol *THIS)
/* /*
* Check password(s) * Check password(s)
*/ */
if( session_addrs_check(remote_data->addrs, remote_data->anum, if( session_addrs_check(state.remoteaddrs, state.n_remoteaddr,
remote_data->passwd, NULL, 0) ) remote_data->passwd, NULL, 0) )
{ {
rc = HRC_BAD_PASSWD; rc = HRC_BAD_PASSWD;
@ -123,8 +123,8 @@ int yoohoo_incoming(s_handshake_protocol *THIS)
else else
{ {
/* Lock (create BSY) remote addresses */ /* Lock (create BSY) remote addresses */
if( session_addrs_lock(remote_data->addrs, if( session_addrs_lock(state.remoteaddrs,
remote_data->anum) ) state.n_remoteaddr) )
{ {
log("all remote addresses are busy"); log("all remote addresses are busy");
rc = HRC_BUSY; rc = HRC_BUSY;
@ -135,7 +135,7 @@ int yoohoo_incoming(s_handshake_protocol *THIS)
* Fill state.node with a first valid * Fill state.node with a first valid
* address, try to lookup it in nodelist * address, try to lookup it in nodelist
*/ */
session_remote_lookup(remote_data->addrs, remote_data->anum); session_remote_lookup(state.remoteaddrs, state.n_remoteaddr);
if( session_check_speed() ) if( session_check_speed() )
rc = HRC_LOW_SPEED; rc = HRC_LOW_SPEED;
@ -180,7 +180,7 @@ int yoohoo_incoming(s_handshake_protocol *THIS)
/* /*
* Create mail/files queue * Create mail/files queue
*/ */
session_create_files_queue(remote_data->addrs, remote_data->anum); session_create_files_queue(state.remoteaddrs, state.n_remoteaddr);
/* /*
* Set FREQ processor status * Set FREQ processor status
@ -238,23 +238,23 @@ int yoohoo_outgoing(s_handshake_protocol *THIS)
/* /*
* Make sure expected address was presented * Make sure expected address was presented
*/ */
if( session_addrs_check_genuine(remote_data->addrs, if( session_addrs_check_genuine(state.remoteaddrs,
remote_data->anum, state.n_remoteaddr,
state.node.addr) ) state.node.addr) )
return HRC_NO_ADDRESS; return HRC_NO_ADDRESS;
/* /*
* Check password(s) * Check password(s)
*/ */
if( session_addrs_check(remote_data->addrs, remote_data->anum, if( session_addrs_check(state.remoteaddrs, state.n_remoteaddr,
remote_data->passwd, NULL, 0) ) remote_data->passwd, NULL, 0) )
return HRC_BAD_PASSWD; return HRC_BAD_PASSWD;
/* /*
* Lock (create BSY) remote addresses * Lock (create BSY) remote addresses
*/ */
(void)session_addrs_lock(remote_data->addrs, (void)session_addrs_lock(state.remoteaddrs,
remote_data->anum); state.n_remoteaddr);
/* /*
* Set protocol we will use ("options" ignored) * Set protocol we will use ("options" ignored)
@ -289,13 +289,12 @@ int yoohoo_outgoing(s_handshake_protocol *THIS)
/* /*
* Create mail/files queue * Create mail/files queue
*/ */
session_create_files_queue(remote_data->addrs, session_create_files_queue(state.remoteaddrs, state.n_remoteaddr);
remote_data->anum);
return HRC_OK; return HRC_OK;
} }
s_faddr *yoohoo_remote_address(s_handshake_protocol *THIS) /*s_faddr *yoohoo_remote_address(s_handshake_protocol *THIS)
{ {
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->remote_data); ASSERT(THIS->remote_data);
@ -304,7 +303,7 @@ s_faddr *yoohoo_remote_address(s_handshake_protocol *THIS)
return &((s_yoohoo_sysinfo *)THIS->remote_data)->addrs[0].addr; return &((s_yoohoo_sysinfo *)THIS->remote_data)->addrs[0].addr;
return NULL; return NULL;
} } */
char *yoohoo_remote_password(s_handshake_protocol *THIS) char *yoohoo_remote_password(s_handshake_protocol *THIS)
{ {
@ -339,7 +338,7 @@ char *yoohoo_remote_system_name(s_handshake_protocol *THIS)
return NULL; return NULL;
} }
s_faddr *yoohoo_local_address(s_handshake_protocol *THIS) /*s_faddr *yoohoo_local_address(s_handshake_protocol *THIS)
{ {
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->local_data); ASSERT(THIS->local_data);
@ -348,7 +347,7 @@ s_faddr *yoohoo_local_address(s_handshake_protocol *THIS)
return &((s_yoohoo_sysinfo *)THIS->local_data)->addrs[0].addr; return &((s_yoohoo_sysinfo *)THIS->local_data)->addrs[0].addr;
return NULL; return NULL;
} } */
char *yoohoo_local_password(s_handshake_protocol *THIS) char *yoohoo_local_password(s_handshake_protocol *THIS)
{ {

@ -58,7 +58,7 @@ static void zmodem_add_empty_packet(s_protinfo *pi)
memset(&pkt, '\0', sizeof(s_packet)); memset(&pkt, '\0', sizeof(s_packet));
pkt.dest = state.node.addr; pkt.dest = state.node.addr;
pkt.orig = *state.handshake->remote_address(state.handshake); if (session_1remote_address()) pkt.orig = *session_1remote_address();
if( pkt_createpacket(p_tmpname, &pkt) ) if( pkt_createpacket(p_tmpname, &pkt) )
{ {

@ -52,8 +52,7 @@ int session_run_command(const char *execstr)
if( state.handshake ) if( state.handshake )
{ {
if( state.handshake->remote_address if( addr = session_1remote_address() )
&& (addr = state.handshake->remote_address(state.handshake)) )
{ {
exec_env_add(&eopts, "REM_ADDR_FTN", exec_env_add(&eopts, "REM_ADDR_FTN",
ftn_addrstr_fido(abuf, *addr)); ftn_addrstr_fido(abuf, *addr));
@ -61,8 +60,7 @@ int session_run_command(const char *execstr)
ftn_addrstr_inet(abuf, *addr)); ftn_addrstr_inet(abuf, *addr));
} }
if( state.handshake->local_address if( addr = session_1local_address() )
&& (addr = state.handshake->local_address(state.handshake)) )
{ {
exec_env_add(&eopts, "LOC_ADDR_FTN", exec_env_add(&eopts, "LOC_ADDR_FTN",
ftn_addrstr_fido(abuf, *addr)); ftn_addrstr_fido(abuf, *addr));
@ -166,27 +164,38 @@ void init_state(s_state *pstate)
void deinit_state(s_state *pstate) void deinit_state(s_state *pstate)
{ {
if( pstate->linename ) if (pstate->linename) free(pstate->linename);
free(pstate->linename); if (pstate->cidstr) free(pstate->cidstr);
if( pstate->cidstr ) if (pstate->peername) free(pstate->peername);
free(pstate->cidstr); if (pstate->connstr) free(pstate->connstr);
if( pstate->peername ) if (pstate->inbound) free(pstate->inbound);
free(pstate->peername); if (pstate->tinbound) free(pstate->tinbound);
if( pstate->connstr ) if (pstate->mailfor) deinit_falist(pstate->mailfor);
free(pstate->connstr);
if( pstate->inbound )
free(pstate->inbound);
if( pstate->tinbound )
free(pstate->tinbound);
if( pstate->mailfor )
deinit_falist(pstate->mailfor);
deinit_fsqueue(&pstate->queue); deinit_fsqueue(&pstate->queue);
if( state.handshake && state.handshake->deinit ) if (state.handshake && state.handshake->deinit) {
state.handshake->deinit(state.handshake); state.handshake->deinit(state.handshake);
}
if (pstate->remoteaddrs) free (pstate->remoteaddrs);
if (pstate->localaddrs) free (pstate->localaddrs);
memset(pstate, '\0', sizeof(s_state)); memset(pstate, '\0', sizeof(s_state));
pstate->session_rc = -1; pstate->session_rc = -1;
} }
s_faddr *session_1remote_address()
{
if (state.n_remoteaddr > 0) return &state.remoteaddrs[0].addr;
return NULL;
}
s_faddr *session_1local_address()
{
if (state.n_localaddr > 0) return &state.localaddrs[0].addr;
return NULL;
}

@ -65,8 +65,8 @@ typedef enum binkp_mode {
typedef struct { typedef struct {
s_sysaddr *addrs; // s_sysaddr *addrs;
int anum; // int anum;
char passwd[BINKP_MAXPASSWD+1]; char passwd[BINKP_MAXPASSWD+1];
char systname[BINKP_MAXSYSTNAME+1]; char systname[BINKP_MAXSYSTNAME+1];
char location[BINKP_MAXLOCATION+1]; char location[BINKP_MAXLOCATION+1];

@ -143,8 +143,8 @@ struct emsi
* {EMSI_DAT} (main handshake information) * {EMSI_DAT} (main handshake information)
*/ */
bool have_emsi; bool have_emsi;
s_sysaddr *addrs; /* dynamicaly allocated array */ // s_sysaddr *addrs; /* dynamicaly allocated array */
int anum; /* number of used entries in it */ // int anum; /* number of used entries in it */
char passwd[EMSI_MAXPASSWD+1]; char passwd[EMSI_MAXPASSWD+1];
s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */ s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */
s_compcodes compcodes; s_compcodes compcodes;

@ -22,8 +22,8 @@
*/ */
typedef struct typedef struct
{ {
s_sysaddr *addrs; /* FTN address */ // s_sysaddr *addrs; /* FTN address */
int anum; // int anum;
int product_code; /* product code */ int product_code; /* product code */
int version_maj; /* major revision of the product */ int version_maj; /* major revision of the product */
int version_min; /* minor revision of the product */ int version_min; /* minor revision of the product */

@ -20,6 +20,14 @@
#include "io.h" #include "io.h"
#include "nodelist.h" #include "nodelist.h"
#include "outbound.h" #include "outbound.h"
typedef struct sysaddr {
s_faddr addr;
bool busy;
bool good;
int flags;
} s_sysaddr;
#include "prot_common.h" #include "prot_common.h"
#ifdef NETSPOOL #ifdef NETSPOOL
@ -62,13 +70,6 @@ typedef enum reqstat {
#define HRC_TEMP_ERR 7 /* Any other temporary handshake error */ #define HRC_TEMP_ERR 7 /* Any other temporary handshake error */
#define HRC_OTHER_ERR 8 /* Any other error (e.g. timeout, NO CARRIER) */ #define HRC_OTHER_ERR 8 /* Any other error (e.g. timeout, NO CARRIER) */
typedef struct sysaddr {
s_faddr addr;
bool busy;
bool good;
int flags;
} s_sysaddr;
typedef struct { typedef struct {
char passwd[128]; char passwd[128];
char challenge[128]; char challenge[128];
@ -109,7 +110,7 @@ typedef struct handshake_protocol
/* /*
* 2. Remote system information extract methods * 2. Remote system information extract methods
*/ */
s_faddr* (*remote_address)(struct handshake_protocol *THIS); // s_faddr* (*remote_address)(struct handshake_protocol *THIS);
char* (*remote_password)(struct handshake_protocol *THIS); char* (*remote_password)(struct handshake_protocol *THIS);
char* (*remote_sysop_name)(struct handshake_protocol *THIS); char* (*remote_sysop_name)(struct handshake_protocol *THIS);
char* (*remote_system_name)(struct handshake_protocol *THIS); char* (*remote_system_name)(struct handshake_protocol *THIS);
@ -122,7 +123,7 @@ typedef struct handshake_protocol
/* /*
* 3. Local system information extract methods * 3. Local system information extract methods
*/ */
s_faddr* (*local_address)(struct handshake_protocol *THIS); // s_faddr* (*local_address)(struct handshake_protocol *THIS);
char* (*local_password)(struct handshake_protocol *THIS); char* (*local_password)(struct handshake_protocol *THIS);
} s_handshake_protocol; } s_handshake_protocol;
@ -162,6 +163,10 @@ const s_modemport *modemport;
#ifdef NETSPOOL #ifdef NETSPOOL
s_netspool_state netspool; s_netspool_state netspool;
#endif #endif
s_sysaddr *remoteaddrs;
int n_remoteaddr;
s_sysaddr *localaddrs;
int n_localaddr;
}; };
typedef struct state s_state; typedef struct state s_state;
@ -187,7 +192,8 @@ int session_init_outgoing();
int session_init_incoming(); int session_init_incoming();
/* s_main.c */ /* s_main.c */
extern s_state state; extern s_state state; // IF YOU WANT MAKE THIS PROGRAM MULTITHREAD, MAKE THIS VARIBLE LOCAL TO THE THREADS AND PASS IT TO SUBROUTINES
// YOU SHOULD ADD IT TO ALL FUNCTIONS: IT IS MANY OF HANDWORK BUT EASY TO DO
s_faddr *session_get_bestaka(s_faddr addr); s_faddr *session_get_bestaka(s_faddr addr);
int session_addrs_lock(s_sysaddr *addrs, int anum); int session_addrs_lock(s_sysaddr *addrs, int anum);
@ -213,6 +219,9 @@ void session_traffic(void);
void session_update_history(s_traffic *send, s_traffic *recv, int rc); void session_update_history(s_traffic *send, s_traffic *recv, int rc);
int session(void); int session(void);
s_faddr* session_1remote_address();
s_faddr* session_1local_address();
/* sess_call.c */ /* sess_call.c */
int call_system(s_faddr addr, const s_bforce_opts *opts); int call_system(s_faddr addr, const s_bforce_opts *opts);
int call_system_modem(void); int call_system_modem(void);

Loading…
Cancel
Save