You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bforce/source/include/session.h

240 lines
8.2 KiB
C

/*
* 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