Allow zero byte locks from another OS

This commit is contained in:
Michiel Broek 2003-12-28 13:57:27 +00:00
parent 6e1d6ecc40
commit b7755b762f
7 changed files with 94 additions and 48 deletions

View File

@ -6,15 +6,24 @@ v0.39.5 24-Dec-2003
Added code for new binkp development, the code is disabled by Added code for new binkp development, the code is disabled by
default and can only be used with the right configure option. default and can only be used with the right configure option.
common.a:
Allows node locking with zero bytes lockfiles created by some
other OS when enabled in the setup.
mbcico: mbcico:
Binkp code cleanup. Binkp code cleanup.
Allow m_file command in binkp during file transfer in progress. Allow m_file command in binkp during file transfer in progress.
Added two temporary binkp sourcefiles for development. Added two temporary binkp sourcefiles for development.
Fixed a segfault when a session failed.
mbout: mbout:
Poll, remove poll and request failed to points which had no Poll, remove poll and request failed to points which had no
point directory in the outbound, now the directory is created. point directory in the outbound, now the directory is created.
mbsetup:
Added setting in menu 1.14 to allow zero bytes lockfiles
created by another OS.
script: script:
Fixed NetBSD init script Fixed NetBSD init script
All init scripts now clean the ~/var/run directory and start All init scripts now clean the ~/var/run directory and start

View File

@ -14,7 +14,7 @@
</HEAD> </HEAD>
<BODY> <BODY>
<BLOCKQUOTE> <BLOCKQUOTE>
<div align="right"><h5>Last update 09-Sep-2003</h5></div> <div align="right"><h5>Last update 28-Dec-2003</h5></div>
<div align="center"><H1>MBSE BBS Setup - Global Setup</H1></div> <div align="center"><H1>MBSE BBS Setup - Global Setup</H1></div>
In this setup you can edit all global settings for MBSE BBS. All sections will In this setup you can edit all global settings for MBSE BBS. All sections will
@ -362,7 +362,7 @@ XX,CM and TCP/IP systems (internet) should use the XX,CM,IBN,IFC flags.
<strong>No Zedzap </strong>Disable zedzap protocol <strong>No Zedzap </strong>Disable zedzap protocol
<strong>No Hydra </strong>Disable Hydra protocol <strong>No Hydra </strong>Disable Hydra protocol
<strong>No MD5 </strong>Disable binkp MD5 passwords <strong>No MD5 </strong>Disable binkp MD5 passwords
<strong>No CRC32 </strong>Disable binkp CRC32 support <strong>Zero Locks OK </strong>Allow zero byte lockfiles from another OS
<strong>Phonetrans 1..40 </strong>Maximum 40 phone number translations <strong>Phonetrans 1..40 </strong>Maximum 40 phone number translations
<strong>Max. files </strong>Maximum files to request, 0 is unlimited <strong>Max. files </strong>Maximum files to request, 0 is unlimited
<strong>Max. MBytes </strong>Maximum MBytes to request, 0 is unlimited <strong>Max. MBytes </strong>Maximum MBytes to request, 0 is unlimited

View File

@ -31,6 +31,8 @@
#include "../config.h" #include "../config.h"
#include "libs.h" #include "libs.h"
#include "structs.h" #include "structs.h"
#include "users.h"
#include "records.h"
#include "clcomm.h" #include "clcomm.h"
#include "common.h" #include "common.h"
@ -41,7 +43,7 @@ int nodelock(faddr *addr, pid_t mypid)
char *fn, *tfn, *p, tmp[16]; char *fn, *tfn, *p, tmp[16];
FILE *fp; FILE *fp;
pid_t pid; pid_t pid;
int tmppid, sverr; int tmppid, sverr, rc;
time_t ltime, now; time_t ltime, now;
fn = bsyname(addr); fn = bsyname(addr);
@ -86,9 +88,10 @@ int nodelock(faddr *addr, pid_t mypid)
} }
/* /*
* Lock exists, check owner * Lock exists, check owner. If rc <> 1 then the lock may have
* been created by another OS (zero bytes lock).
*/ */
fscanf(fp, "%d", &tmppid); rc = fscanf(fp, "%d", &tmppid);
pid = tmppid; pid = tmppid;
fclose(fp); fclose(fp);
@ -106,7 +109,15 @@ int nodelock(faddr *addr, pid_t mypid)
*/ */
ltime = file_time(fn); ltime = file_time(fn);
now = time(NULL); now = time(NULL);
if (kill(pid, 0) && (errno == ESRCH)) { if (CFG.ZeroLocks && (rc != 1) && (((unsigned long)now - (unsigned long)ltime) > 21600)) {
Syslog('+', "Found zero byte lock older then 6 hours for %s, unlink", ascfnode(addr,0x1f));
unlink(fn);
} else if (CFG.ZeroLocks && (rc != 1)) {
Syslog('+', "Node %s is locked from another OS", ascfnode(addr, 0x1f));
unlink(tfn);
free(tfn);
return 1;
} else if (kill(pid, 0) && (errno == ESRCH)) {
Syslog('+', "Found stale bsy file for %s, unlink", ascfnode(addr,0x1f)); Syslog('+', "Found stale bsy file for %s, unlink", ascfnode(addr,0x1f));
unlink(fn); unlink(fn);
} else if (((unsigned long)now - (unsigned long)ltime) > 21600) { } else if (((unsigned long)now - (unsigned long)ltime) > 21600) {
@ -139,19 +150,24 @@ int nodeulock(faddr *addr, pid_t mypid)
char *fn; char *fn;
FILE *fp; FILE *fp;
pid_t pid; pid_t pid;
int tmppid; int tmppid = 0, rc;
fn = bsyname(addr); fn = bsyname(addr);
if ((fp = fopen(fn, "r")) == NULL) { if ((fp = fopen(fn, "r")) == NULL) {
WriteError("$Can't open lock file (%s) \"%s\"", ascfnode(addr, 0x1f), fn); Syslog('+', "Unlock %s failed, not locked", ascfnode(addr, 0x1f));
return 1; return 1;
} }
fscanf(fp, "%d", &tmppid); rc = fscanf(fp, "%d", &tmppid);
pid = tmppid; pid = tmppid;
fclose(fp); fclose(fp);
if (pid == mypid) { if (CFG.ZeroLocks && (rc != 1)) {
/*
* Zero byte lock from another OS, leave alone.
*/
return 0;
} else if (pid == mypid) {
unlink(fn); unlink(fn);
return 0; return 0;
} else { } else {

View File

@ -725,7 +725,7 @@ struct sysconfig {
unsigned xNoJanus : 1; unsigned xNoJanus : 1;
unsigned NoHydra : 1; /* Don't do Hydra */ unsigned NoHydra : 1; /* Don't do Hydra */
unsigned xNoIBN : 1; unsigned ZeroLocks : 1; /* Allow 0 bytes locking */
unsigned xNoITN : 1; unsigned xNoITN : 1;
unsigned xNoIFC : 1; unsigned xNoIFC : 1;

View File

@ -131,11 +131,11 @@ struct binkprec bp; /* Global structure */
/* /*
* Prototypes * Prototypes
*/ */
int binkp_send_frame(int, char *, int); /* Send cmd/data frame */ int binkp_send_frame(int, char *, int); /* Send cmd/data frame */
int binkp_send_command(int, ...); /* Send command frame */ int binkp_send_command(int, ...); /* Send command frame */
void binkp_settimer(int); /* Set timeout timer */ void binkp_settimer(int); /* Set timeout timer */
int binkp_expired(void); /* Timer expired? */ int binkp_expired(void); /* Timer expired? */
int binkp_banner(void); /* Send system banner */ int binkp_banner(void); /* Send system banner */
int binkp_recv_command(char *, int *, int *); /* Receive command frame */ int binkp_recv_command(char *, int *, int *); /* Receive command frame */
void parse_m_nul(char *); /* Parse M_NUL message */ void parse_m_nul(char *); /* Parse M_NUL message */
@ -175,17 +175,21 @@ int binkp(int role)
if (rc) { if (rc) {
Syslog('!', "Binkp: session failed"); Syslog('!', "Binkp: session failed");
goto binkperr; goto binkpend;
} }
binkperr: binkpend:
/* /*
* Deinit * Deinit
*/ */
Syslog('b', "Binkp: deinit start");
if (bp.MD_Challenge) if (bp.MD_Challenge)
free(bp.MD_Challenge); free(bp.MD_Challenge);
if (bp.rxbuf) if (bp.rxbuf)
free(bp.rxbuf); free(bp.rxbuf);
Syslog('b', "Binkp: deinit end");
rc = abs(rc);
Syslog('b', "Binkp: rc=%d", rc);
return rc; return rc;
} }
@ -489,6 +493,10 @@ SM_RETURN
* Functions * Functions
*/ */
/*
* Send a binkp frame
*/
int binkp_send_frame(int cmd, char *buf, int len) int binkp_send_frame(int cmd, char *buf, int len)
{ {
unsigned short header = 0; unsigned short header = 0;
@ -513,6 +521,9 @@ int binkp_send_frame(int cmd, char *buf, int len)
/*
* Send a command message
*/
int binkp_send_command(int id, ...) int binkp_send_command(int id, ...)
{ {
va_list args; va_list args;
@ -543,6 +554,9 @@ int binkp_send_command(int id, ...)
/*
* Set binkp master timer
*/
void binkp_settimer(int interval) void binkp_settimer(int interval)
{ {
Timer = time((time_t*)NULL) + interval; Timer = time((time_t*)NULL) + interval;
@ -550,6 +564,9 @@ void binkp_settimer(int interval)
/*
* Test if master timer is expired
*/
int binkp_expired(void) int binkp_expired(void)
{ {
time_t now; time_t now;
@ -562,6 +579,9 @@ int binkp_expired(void)
/*
* Send system info to remote
*/
int binkp_banner(void) int binkp_banner(void)
{ {
time_t t; time_t t;
@ -708,5 +728,4 @@ void parse_m_nul(char *msg)
#endif #endif

View File

@ -182,6 +182,7 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
if (rc == 0) if (rc == 0)
putstatus(tmpl->addr, 0, 0); putstatus(tmpl->addr, 0, 0);
} }
tidy_falist(&remote); tidy_falist(&remote);
if (data) if (data)
free(data); free(data);
@ -192,9 +193,6 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
if (emsi_remote_password) if (emsi_remote_password)
free(emsi_remote_password); free(emsi_remote_password);
if (nlent->addr.domain)
free(nlent->addr.domain);
inbound_close(rc == 0); inbound_close(rc == 0);
return rc; return rc;
} }

View File

@ -1227,17 +1227,18 @@ void s_mailer(void)
mvprintw(16, 2, "10. No EMSI session"); mvprintw(16, 2, "10. No EMSI session");
mvprintw(17, 2, "11. No Yooho/2U2"); mvprintw(17, 2, "11. No Yooho/2U2");
mvprintw(14,31, "12. No Zmodem"); mvprintw(13,31, "12. No Zmodem");
mvprintw(15,31, "13. No Zedzap"); mvprintw(14,31, "13. No Zedzap");
mvprintw(16,31, "14. No Hydra"); mvprintw(15,31, "14. No Hydra");
mvprintw(17,31, "15. No MD5"); mvprintw(16,31, "15. No MD5");
mvprintw(17,31, "16. Zero Locks OK");
mvprintw(12,59, "16. Phonetrans 1-10"); mvprintw(12,59, "17. Phonetrans 1-10");
mvprintw(13,59, "17. Phonetrans 11-20"); mvprintw(13,59, "18. Phonetrans 11-20");
mvprintw(14,59, "18. Phonetrans 21-30"); mvprintw(14,59, "19. Phonetrans 21-30");
mvprintw(15,59, "19. Phonetrans 31-40"); mvprintw(15,59, "20. Phonetrans 31-40");
mvprintw(16,59, "20. Max. files"); mvprintw(16,59, "21. Max. files");
mvprintw(17,59, "21. Max. MB."); mvprintw(17,59, "22. Max. MB.");
} }
@ -1292,15 +1293,16 @@ void e_mailer(void)
show_bool(16,23, CFG.NoEMSI); show_bool(16,23, CFG.NoEMSI);
show_bool(17,23, CFG.NoWazoo); show_bool(17,23, CFG.NoWazoo);
show_bool(14,52, CFG.NoZmodem); show_bool(13,52, CFG.NoZmodem);
show_bool(15,52, CFG.NoZedzap); show_bool(14,52, CFG.NoZedzap);
show_bool(16,52, CFG.NoHydra); show_bool(15,52, CFG.NoHydra);
show_bool(17,52, CFG.NoMD5); show_bool(16,52, CFG.NoMD5);
show_bool(17,52, CFG.ZeroLocks);
show_int( 16,75, CFG.Req_Files); show_int( 16,75, CFG.Req_Files);
show_int( 17,75, CFG.Req_MBytes); show_int( 17,75, CFG.Req_MBytes);
switch(select_menu(21)) { switch(select_menu(22)) {
case 0: return; case 0: return;
case 1: E_LOGL(CFG.cico_loglevel, "1.14.1", s_mailer) case 1: E_LOGL(CFG.cico_loglevel, "1.14.1", s_mailer)
case 2: E_STR( 8,23,20,CFG.Phone, "The mailer default ^phone number^ for this system") case 2: E_STR( 8,23,20,CFG.Phone, "The mailer default ^phone number^ for this system")
@ -1314,17 +1316,18 @@ void e_mailer(void)
case 10:E_BOOL(16,23, CFG.NoEMSI, "If set then ^EMSI handshake^ is diabled") case 10:E_BOOL(16,23, CFG.NoEMSI, "If set then ^EMSI handshake^ is diabled")
case 11:E_BOOL(17,23, CFG.NoWazoo, "If set then ^YooHoo/2U2^ (FTSC-0006) is disabled") case 11:E_BOOL(17,23, CFG.NoWazoo, "If set then ^YooHoo/2U2^ (FTSC-0006) is disabled")
case 12:E_BOOL(14,52, CFG.NoZmodem, "If set then the ^Zmodem^ protocol is disabled") case 12:E_BOOL(13,52, CFG.NoZmodem, "If set then the ^Zmodem^ protocol is disabled")
case 13:E_BOOL(15,52, CFG.NoZedzap, "If set then the ^Zedzap^ protocol is disabled") case 13:E_BOOL(14,52, CFG.NoZedzap, "If set then the ^Zedzap^ protocol is disabled")
case 14:E_BOOL(16,52, CFG.NoHydra, "If set then the ^Hydra^ protocol is disabled") case 14:E_BOOL(15,52, CFG.NoHydra, "If set then the ^Hydra^ protocol is disabled")
case 15:E_BOOL(17,52, CFG.NoMD5, "Disable ^MD5 crypted^ passwords with binkp sessions") case 15:E_BOOL(16,52, CFG.NoMD5, "Disable ^MD5 crypted^ passwords with binkp sessions")
case 16:E_BOOL(17,52, CFG.ZeroLocks, "Allow ^zero byte node lockfiles^ created by another OS")
case 16:e_trans(0, 17); break; case 17:e_trans(0, 17); break;
case 17:e_trans(10, 18); break; case 18:e_trans(10, 18); break;
case 18:e_trans(20, 19); break; case 19:e_trans(20, 19); break;
case 19:e_trans(30, 20); break; case 20:e_trans(30, 20); break;
case 20:E_INT(16,75, CFG.Req_Files, "Maximum ^files^ to request, 0 is unlimited") case 21:E_INT(16,75, CFG.Req_Files, "Maximum ^files^ to request, 0 is unlimited")
case 21:E_INT(17,75, CFG.Req_MBytes, "Maximum ^MBytes^ to request, 0 is unlimited") case 22:E_INT(17,75, CFG.Req_MBytes, "Maximum ^MBytes^ to request, 0 is unlimited")
} }
} }
} }
@ -1916,6 +1919,7 @@ int global_doc(FILE *fp, FILE *toc, int page)
fprintf(fp, " No Zedzap %s\n", getboolean(CFG.NoZedzap)); fprintf(fp, " No Zedzap %s\n", getboolean(CFG.NoZedzap));
fprintf(fp, " No Hydra %s\n", getboolean(CFG.NoHydra)); fprintf(fp, " No Hydra %s\n", getboolean(CFG.NoHydra));
fprintf(fp, " No MD5 passwords %s\n", getboolean(CFG.NoMD5)); fprintf(fp, " No MD5 passwords %s\n", getboolean(CFG.NoMD5));
fprintf(fp, " 0 bytes locks OK %s\n", getboolean(CFG.ZeroLocks));
fprintf(fp, " Max request files %d\n", CFG.Req_Files); fprintf(fp, " Max request files %d\n", CFG.Req_Files);
fprintf(fp, " Max request MBytes %d\n", CFG.Req_MBytes); fprintf(fp, " Max request MBytes %d\n", CFG.Req_MBytes);