|
|
|
/*
|
|
|
|
* binkleyforce -- unix FTN mailer project
|
|
|
|
*
|
|
|
|
* Copyright (c) 1998-2000 Alexander Belkin, 2:5020/1398.11
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* $Id$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _S_MAIN_H_
|
|
|
|
#define _S_MAIN_H_
|
|
|
|
|
|
|
|
#define CALLOPT_FORCE 0x01
|
|
|
|
#define CALLOPT_INET 0x02
|
|
|
|
|
|
|
|
#include "io.h"
|
|
|
|
#include "nodelist.h"
|
|
|
|
#include "outbound.h"
|
|
|
|
|
|
|
|
typedef struct sysaddr {
|
|
|
|
s_faddr addr;
|
|
|
|
bool busy;
|
|
|
|
bool good;
|
|
|
|
int flags;
|
|
|
|
} s_sysaddr;
|
|
|
|
|
|
|
|
#include "prot_common.h"
|
|
|
|
|
|
|
|
#ifdef NETSPOOL
|
|
|
|
#include "netspool.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef enum session {
|
|
|
|
SESSION_UNKNOWN,
|
|
|
|
SESSION_FTSC,
|
|
|
|
SESSION_YOOHOO,
|
|
|
|
SESSION_EMSI,
|
|
|
|
SESSION_BINKP
|
|
|
|
} e_session;
|
|
|
|
|
|
|
|
typedef enum protocol {
|
|
|
|
PROT_NOPROT,
|
|
|
|
PROT_XMODEM,
|
|
|
|
PROT_ZMODEM,
|
|
|
|
PROT_ZEDZAP,
|
|
|
|
PROT_DIRZAP,
|
|
|
|
PROT_JANUS,
|
|
|
|
PROT_HYDRA,
|
|
|
|
PROT_TCP,
|
|
|
|
PROT_BINKP
|
|
|
|
} e_protocol;
|
|
|
|
|
|
|
|
typedef enum reqstat {
|
|
|
|
REQS_DISABLED, /* Freqs not supported by the system */
|
|
|
|
REQS_ALLOW, /* We will process file requests */
|
|
|
|
REQS_NOTALLOW /* Freqs TEMPORARY disabled for any reason */
|
|
|
|
} e_reqstat;
|
|
|
|
|
|
|
|
#define HRC_OK 0 /* No errors */
|
|
|
|
#define HRC_LOW_SPEED 1 /* Connect speed too low (shown it in EMSI) */
|
|
|
|
#define HRC_BAD_PASSWD 2 /* Pasword failure (shown it in EMSI) */
|
|
|
|
#define HRC_NO_ADDRESS 3 /* Expected address was not presented */
|
|
|
|
#define HRC_NO_PROTOS 4 /* No common protocols :( */
|
|
|
|
#define HRC_BUSY 5 /* All remote AKAs are busy */
|
|
|
|
#define HRC_FATAL_ERR 6 /* Any other fatal 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) */
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
char passwd[128];
|
|
|
|
char challenge[128];
|
|
|
|
int challenge_length;
|
|
|
|
bool cram_auth;
|
|
|
|
} s_session_passwd;
|
|
|
|
|
|
|
|
typedef struct sendopts {
|
|
|
|
int fnc:1, /* Convert outgoing file names to 8+3 format */
|
|
|
|
holdreq:1, /* Hold .REQ files? (file requests) */
|
|
|
|
holdhold:1, /* Hold files with HOLD flavor? */
|
|
|
|
holdfiles:1, /* Hold all files except netmail + arcmail */
|
|
|
|
holdxt:1, /* Hold all except netmail? */
|
|
|
|
holdall:1, /* Hold ALL trafic!? */
|
|
|
|
hydraRH1; /* Hydra RH1 mode (EMSI only) */
|
|
|
|
} s_sendopts;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Handhake protocols API
|
|
|
|
*/
|
|
|
|
typedef struct handshake_protocol
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* 1. Main pointers
|
|
|
|
*/
|
|
|
|
char *verbal_name;
|
|
|
|
char *author;
|
|
|
|
char *standard;
|
|
|
|
char *remote_data;
|
|
|
|
char *local_data;
|
|
|
|
e_protocol protocol;
|
|
|
|
|
|
|
|
void (*init)(struct handshake_protocol *THIS);
|
|
|
|
void (*deinit)(struct handshake_protocol *THIS);
|
|
|
|
int (*incoming_session)(struct handshake_protocol *THIS);
|
|
|
|
int (*outgoing_session)(struct handshake_protocol *THIS);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 2. Remote system information extract methods
|
|
|
|
*/
|
|
|
|
// s_faddr* (*remote_address)(struct handshake_protocol *THIS);
|
|
|
|
char* (*remote_password)(struct handshake_protocol *THIS);
|
|
|
|
char* (*remote_sysop_name)(struct handshake_protocol *THIS);
|
|
|
|
char* (*remote_system_name)(struct handshake_protocol *THIS);
|
|
|
|
char* (*remote_location)(struct handshake_protocol *THIS);
|
|
|
|
char* (*remote_phone)(struct handshake_protocol *THIS);
|
|
|
|
char* (*remote_flags)(struct handshake_protocol *THIS);
|
|
|
|
char* (*remote_mailer)(struct handshake_protocol *THIS);
|
|
|
|
int (*remote_traffic)(struct handshake_protocol *THIS, s_traffic *dest);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 3. Local system information extract methods
|
|
|
|
*/
|
|
|
|
// s_faddr* (*local_address)(struct handshake_protocol *THIS);
|
|
|
|
char* (*local_password)(struct handshake_protocol *THIS);
|
|
|
|
} s_handshake_protocol;
|
|
|
|
|
|
|
|
struct state
|
|
|
|
{
|
|
|
|
s_node node;
|
|
|
|
const s_modemport *modemport;
|
|
|
|
char *linename; /* Verbal line name (i.e. ttyS1, tcpip, etc.) */
|
|
|
|
time_t start_time; /* Session start time (e.g. connect time) */
|
|
|
|
e_tcpmode tcpmode; /* Current mode to work via TCP/IP */
|
|
|
|
e_session session; /* handshake type (EMSI, YooHoo, etc.) */
|
|
|
|
bool valid; /* This structure contain real information */
|
|
|
|
bool caller; /* Outgoing session */
|
|
|
|
bool protected; /* Password protected session? */
|
|
|
|
bool listed; /* Session with listed system? */
|
|
|
|
bool inet; /* We are working via TCP/IP now */
|
|
|
|
int session_rc; /* Session return code */
|
|
|
|
s_sendopts sopts; /* Our send options (hold arcmail, etc.) */
|
|
|
|
e_reqstat reqstat; /* Our file request processor status */
|
|
|
|
s_override override;
|
|
|
|
s_sess_stat sess_stat; /* Try counters, hold timers, etc. */
|
|
|
|
long connspeed;
|
|
|
|
long minspeed;
|
|
|
|
char *cidstr; /* Caller Phone/ID when we are answering */
|
|
|
|
char *peername; /* Remote peer name than using TCP/IP */
|
|
|
|
long peerport; /* Remote port number, we are connected to */
|
|
|
|
char *connstr;
|
|
|
|
char *inbound; /* Inbound directory for this session */
|
|
|
|
char *tinbound; /* Temporary inbound for this session */
|
|
|
|
s_traffic traff_send; /* Expected outgoing traffic */
|
|
|
|
s_traffic traff_recv; /* Expected incoming traffic */
|
|
|
|
|
|
|
|
s_handshake_protocol *handshake;
|
|
|
|
|
|
|
|
s_falist *mailfor; /* Remote valid addresses */
|
|
|
|
s_fsqueue queue; /* Send files queue */
|
|
|
|
#ifdef NETSPOOL
|
|
|
|
s_netspool_state netspool;
|
|
|
|
#endif
|
|
|
|
s_sysaddr *remoteaddrs;
|
|
|
|
int n_remoteaddr;
|
|
|
|
s_sysaddr *localaddrs;
|
|
|
|
int n_localaddr;
|
|
|
|
};
|
|
|
|
typedef struct state s_state;
|
|
|
|
|
|
|
|
/* s_common.c */
|
|
|
|
int session_get_local_address(s_faddr *addr);
|
|
|
|
int session_get_remote_address(s_faddr *addr);
|
|
|
|
int session_get_remote_sysop(char **dest);
|
|
|
|
int session_get_remote_systname(char **const dest);
|
|
|
|
int session_get_remote_mailer(char **const dest);
|
|
|
|
int session_get_remote_phone(char **const dest);
|
|
|
|
int session_get_remote_location(char **const dest);
|
|
|
|
int session_is_remote_protected(void);
|
|
|
|
int session_is_remote_listed(void);
|
|
|
|
int session_get_callerid(char **const dest);
|
|
|
|
int session_get_connect(char **const dest);
|
|
|
|
int session_run_command(const char *execstr);
|
|
|
|
int override_get(s_override *dest, s_faddr addr, int line);
|
|
|
|
void init_state(s_state *pstate);
|
|
|
|
void deinit_state(s_state *pstate);
|
|
|
|
|
|
|
|
/* s_init.c */
|
|
|
|
int session_init_outgoing();
|
|
|
|
int session_init_incoming();
|
|
|
|
|
|
|
|
/* s_main.c */
|
|
|
|
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);
|
|
|
|
int session_addrs_lock(s_sysaddr *addrs, int anum);
|
|
|
|
int session_addrs_add(s_sysaddr **addrs, int *anum, s_faddr addr);
|
|
|
|
int session_addrs_check(s_sysaddr *addrs, int anum, const char *passwd,
|
|
|
|
const char *challenge, int challenge_length);
|
|
|
|
int session_addrs_to_falist(s_sysaddr *addrs, int anum, s_falist **dest);
|
|
|
|
int session_addrs_check_genuine(s_sysaddr *addrs, int anum, s_faddr expected);
|
|
|
|
int session_check_speed(void);
|
|
|
|
int session_check_addr(s_faddr addr);
|
|
|
|
int session_get_password(s_faddr addr, char *buffer, size_t buflen);
|
|
|
|
int session_remote_lookup(s_sysaddr *addrs, int anum);
|
|
|
|
void session_remote_log_status(void);
|
|
|
|
/*int session_check_password(s_faddr addr, const char *passwd); seems not used*/
|
|
|
|
int session_set_inbound(void);
|
|
|
|
void session_set_freqs_status(void);
|
|
|
|
void session_set_send_options(void);
|
|
|
|
void session_set_send_files(void);
|
|
|
|
int session_create_files_queue(s_sysaddr *addrs, int anum);
|
|
|
|
int session_traffic_set_incoming(s_traffic *dest);
|
|
|
|
int session_traffic_set_outgoing(s_traffic *dest);
|
|
|
|
void session_traffic(void);
|
|
|
|
void session_update_history(s_traffic *send, s_traffic *recv, int rc);
|
|
|
|
int session(void);
|
|
|
|
|
|
|
|
s_faddr* session_1remote_address();
|
|
|
|
s_faddr* session_1local_address();
|
|
|
|
|
|
|
|
/* sess_call.c */
|
|
|
|
int call_system(s_faddr addr, const s_bforce_opts *opts);
|
|
|
|
int call_system_modem(void);
|
|
|
|
int call_system_tcpip(int callwith);
|
|
|
|
|
|
|
|
/* sess_answ.c */
|
|
|
|
int answ_system(e_session type, char *connstr, int inetd);
|
|
|
|
|
|
|
|
/* sess_stat.c */
|
|
|
|
void session_stat_reset_counters(s_sess_stat *stat);
|
|
|
|
int session_stat_get(s_sess_stat *stat, s_faddr *addr);
|
|
|
|
int session_stat_apply_diff(s_faddr addr, s_sess_stat stat);
|
|
|
|
int session_stat_update(s_faddr *addr, s_sess_stat *stat, bool caller, int rc);
|
|
|
|
|
|
|
|
#endif
|