diff --git a/ChangeLog b/ChangeLog index 40645fba..b8accd6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,7 +2,43 @@ $Id$ MBSEBBS History. -v0.35.01 05-Jun-2002 +v0.35.02 22-Jun-2002 + + general: + Added checks for GoldED in external program checks. + Added new empty path /opt/mbse/var/boxes. + Implemented nodes private outbound boxes. + + common.a: + Added debug nodelist IFT flag for logging. + + mbsetup: + Changed node records layout into 8 screens to be able to add + more settings. New settings not in use yet are disabled. + Added settings for node contact information. This is private + for mbsetup use only. + Implemented nodes special outbound box setup. When you enter + that item for the first time, it fills this with a suggested + path. + + mbcico: + Implemented nodes special outbound boxes. + + mbout: + Implemented nodes special outbound boxes. + + mbfido: + In newsmode when a mesage is received with an illegal formated + date headerline, the date is replaced with the current date + and time. Possible cause: SunMail 1.0 + + mbtask: + When first run the goldnode command is only filled in if it + excists in the mbtask configuration. + Implemented nodes special outbound boxes. + + +v0.35.01 05-Jun-2002 - 22-Jun-2002 upgrade: Start mbsetup, check in the nodes setup if all the session diff --git a/Makefile b/Makefile index 0808e4ff..987ac7a3 100644 --- a/Makefile +++ b/Makefile @@ -144,6 +144,11 @@ install: ${CHOWN} -R ${OWNER}.${GROUP} ${PREFIX}/var ; \ chmod -R 0750 ${PREFIX}/var ; \ fi + @if [ ! -d ${PREFIX}/var/boxes ]; then \ + mkdir ${PREFIX}/var/boxes ; \ + ${CHOWN} ${OWNER}.${GROUP} ${PREFIX}/var/boxes ; \ + chmod 0750 ${PREFIX}/var/boxes ; \ + fi @if [ ! -d ${PREFIX}/var/unknown ] ; then \ mkdir ${PREFIX}/var/unknown ; \ mkdir ${PREFIX}/var/inbound ; \ diff --git a/TODO b/TODO index 97114cf2..5fdc4645 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ $Id$ - MBSE BBS V0.35.01 TODO list. + MBSE BBS V0.35.02 TODO list. ---------------------------- These are a list of things that must be implemented one way or diff --git a/configure b/configure index 17bba439..f8567474 100755 --- a/configure +++ b/configure @@ -1196,7 +1196,7 @@ SUBDIRS="lib mbcico mbfido mbmon mbsebbs mbtask mbsetup unix lang examples html PACKAGE="mbsebbs" -VERSION="0.35.01" +VERSION="0.35.02" COPYRIGHT="Copyright (C) 1997-2002 Michiel Broek, All Rights Reserved" SHORTRIGHT="Copyright (C) 1997-2002 M. Broek" GROUP="bbs" @@ -7689,6 +7689,85 @@ else echo "${ECHO_T}no" >&6 fi +# Extract the first word of "golded", so it can be a program name with args. +set dummy golded; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GOLDEDBIN+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GOLDEDBIN in + [\\/]* | ?:[\\/]*) + ac_cv_path_GOLDEDBIN="$GOLDEDBIN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GOLDEDBIN="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +GOLDEDBIN=$ac_cv_path_GOLDEDBIN + +if test -n "$GOLDEDBIN"; then + echo "$as_me:$LINENO: result: $GOLDEDBIN" >&5 +echo "${ECHO_T}$GOLDEDBIN" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +# Extract the first word of "goldnode", so it can be a program name with args. +set dummy goldnode; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GOLDNODE+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GOLDNODE in + [\\/]* | ?:[\\/]*) + ac_cv_path_GOLDNODE="$GOLDNODE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GOLDNODE="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +GOLDNODE=$ac_cv_path_GOLDNODE + +if test -n "$GOLDNODE"; then + echo "$as_me:$LINENO: result: $GOLDNODE" >&5 +echo "${ECHO_T}$GOLDNODE" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + # Check whether --with-log-compress or --without-log-compress was given. if test "${with_log_compress+set}" = set; then @@ -8375,6 +8454,8 @@ s,@RB@,$RB,;t t s,@SB@,$SB,;t t s,@RZ@,$RZ,;t t s,@SZ@,$SZ,;t t +s,@GOLDEDBIN@,$GOLDEDBIN,;t t +s,@GOLDNODE@,$GOLDNODE,;t t s,@LOG_COMPRESS@,$LOG_COMPRESS,;t t s,@LOG_COMPRESSEXT@,$LOG_COMPRESSEXT,;t t CEOF diff --git a/configure.in b/configure.in index 4615a066..97a79fcf 100644 --- a/configure.in +++ b/configure.in @@ -9,7 +9,7 @@ AC_SUBST(SUBDIRS) dnl General settings for MBSE BBS dnl After changeing the version number, run autoconf! PACKAGE="mbsebbs" -VERSION="0.35.01" +VERSION="0.35.02" COPYRIGHT="Copyright (C) 1997-2002 Michiel Broek, All Rights Reserved" SHORTRIGHT="Copyright (C) 1997-2002 M. Broek" GROUP="bbs" @@ -175,6 +175,9 @@ AC_PATH_PROG(RB,rb) AC_PATH_PROG(SB,sb) AC_PATH_PROG(RZ,rz) AC_PATH_PROG(SZ,sz) +AC_PATH_PROG(GOLDEDBIN,golded) +AC_PATH_PROG(GOLDNODE,goldnode) + dnl AC_ARG_WITH(log-compress,[ --with-log-compress=METHOD Log compression method (default gzip)], LOG_COMPRESS=$with_log_compress, LOG_COMPRESS=gzip) case "$LOG_COMPRESS" in diff --git a/lib/nodelist.c b/lib/nodelist.c index dfca2f49..05dbcb61 100644 --- a/lib/nodelist.c +++ b/lib/nodelist.c @@ -608,6 +608,8 @@ void ipflags(unsigned long flags) t = xstrcat(t, (char *)" IVM"); if (flags & IP_IP) t = xstrcat(t, (char *)" IP"); + if (flags & IP_IFT) + t = xstrcat(t, (char *)" IFT"); Syslog('s', "%s", t); free(t); } diff --git a/lib/structs.h b/lib/structs.h index 5f9700ae..b1b4784c 100644 --- a/lib/structs.h +++ b/lib/structs.h @@ -1240,7 +1240,7 @@ struct _nodes { unsigned Dir_in_waitclr : 1; /* Inbound wait for clear */ unsigned Dir_in_mklck : 1; /* Inbound create lock */ - /* FTP transfer */ + /* FTP transfers */ char FTP_site[65]; /* Site name or IP address */ char FTP_user[17]; /* Username */ char FTP_pass[17]; /* Password */ @@ -1256,12 +1256,24 @@ struct _nodes { unsigned FTP_unique : 1; /* Unique storage */ unsigned FTP_uppercase : 1; /* Force uppercase */ unsigned FTP_lowercase : 1; /* Force lowercase */ + unsigned FTP_passive : 1; /* Passive mode */ unsigned FTP_out_chklck : 1; /* Outbound check lockfile */ unsigned FTP_out_waitclr : 1; /* Outbound wait for clear */ unsigned FTP_out_mklck : 1; /* Outbound create lock */ unsigned FTP_in_chklck : 1; /* Inbound check lockfile */ unsigned FTP_in_waitclr : 1; /* Inbound wait for clear */ unsigned FTP_in_mklck : 1; /* Inbound create lock */ + + char OutBox[65]; /* Node's personal outbound */ + char Nl_flags[65]; /* Override nodelist flags */ + char Nl_hostname[41]; /* Override hostname */ + + /* Contact information */ + char Ct_phone[17]; /* Node's private phone */ + char Ct_fax[17]; /* Node's fax */ + char Ct_cellphone[21]; /* Node's cellphone */ + char Ct_email[31]; /* Node's email */ + char Ct_remark[65]; /* Remark */ }; diff --git a/mbcico/filelist.c b/mbcico/filelist.c index 5386bf48..7bdf0552 100644 --- a/mbcico/filelist.c +++ b/mbcico/filelist.c @@ -43,46 +43,47 @@ #define PATH_MAX 512 #endif -extern int master; -int made_request; +extern int master; +extern int Loaded; +int made_request; static char *tmpkname(void); static char *tmpkname(void) { - static char buf[16]; + static char buf[16]; - sprintf(buf,"%08lx.pkt", sequencer()); - return buf; + sprintf(buf,"%08lx.pkt", sequencer()); + return buf; } char *xtodos(char *orig) { - char buf[13], *copy, *p; + char buf[13], *copy, *p; - if (orig == NULL) - return NULL; + if (orig == NULL) + return NULL; - if ((remote_flags & SESSION_FNC) == 0) { - Syslog('o', "No filename conversion for \"%s\"", MBSE_SS(orig)); - return xstrcpy(orig); - } + if ((remote_flags & SESSION_FNC) == 0) { + Syslog('o', "No filename conversion for \"%s\"", MBSE_SS(orig)); + return xstrcpy(orig); + } - copy = xstrcpy(orig); - if ((p = strrchr(copy,'/'))) - p++; - else - p = copy; + copy = xstrcpy(orig); + if ((p = strrchr(copy,'/'))) + p++; + else + p = copy; - name_mangle(p); - memset(&buf, 0, sizeof(buf)); - strncpy(buf, p, 12); - Syslog('o', "name \"%s\" converted to \"%s\"", MBSE_SS(orig), MBSE_SS(buf)); - free(copy); - return xstrcpy(buf); + name_mangle(p); + memset(&buf, 0, sizeof(buf)); + strncpy(buf, p, 12); + Syslog('o', "name \"%s\" converted to \"%s\"", MBSE_SS(orig), MBSE_SS(buf)); + free(copy); + return xstrcpy(buf); } @@ -100,29 +101,28 @@ char *xtodos(char *orig) */ void add_list(file_list **lst, char *local, char *Remote, int disposition, off_t floff, FILE *flofp, int toend) { - file_list **tmpl; - file_list *tmp; + file_list **tmpl, *tmp; - Syslog('o', "add_list(\"%s\",\"%s\",%d,%s)", MBSE_SS(local),MBSE_SS(Remote),disposition,toend?"to end":"to beg"); + Syslog('o', "add_list(\"%s\",\"%s\",%d,%s)", MBSE_SS(local),MBSE_SS(Remote),disposition,toend?"to end":"to beg"); - if (toend) - for (tmpl = lst; *tmpl; tmpl =&((*tmpl)->next)); - else - tmpl = &tmp; - *tmpl = (file_list*)malloc(sizeof(file_list)); - if (toend) { - (*tmpl)->next = NULL; - } else { - (*tmpl)->next = *lst; - *lst = *tmpl; - } + if (toend) + for (tmpl = lst; *tmpl; tmpl =&((*tmpl)->next)); + else + tmpl = &tmp; + *tmpl = (file_list*)malloc(sizeof(file_list)); + if (toend) { + (*tmpl)->next = NULL; + } else { + (*tmpl)->next = *lst; + *lst = *tmpl; + } - (*tmpl)->remote = xtodos(Remote); - (*tmpl)->local = xstrcpy(local); - (*tmpl)->disposition = disposition; - (*tmpl)->floff = floff; - (*tmpl)->flofp = flofp; - return; + (*tmpl)->remote = xtodos(Remote); + (*tmpl)->local = xstrcpy(local); + (*tmpl)->disposition = disposition; + (*tmpl)->floff = floff; + (*tmpl)->flofp = flofp; + return; } @@ -130,187 +130,248 @@ void add_list(file_list **lst, char *local, char *Remote, int disposition, off_t static void check_flo(file_list **, char *); static void check_flo(file_list **lst, char *nm) { - FILE *fp; - off_t off; - struct flock fl; - char buf[PATH_MAX],buf2[PATH_MAX],*p,*q; - int disposition; - struct stat stbuf; - - Syslog('O', "check_flo(\"%s\")",MBSE_SS(nm)); - - if ((fp = fopen(nm,"r+")) == NULL) { - Syslog('O',"no flo file"); - return; - } - fl.l_type = F_RDLCK; - fl.l_whence = 0; - fl.l_start = 0L; - fl.l_len = 0L; - if (fcntl(fileno(fp), F_SETLK, &fl) != 0) { - if (errno != EAGAIN) - WriteError("$cannot read-lock \"%s\"",MBSE_SS(nm)); - else - Syslog('O',"flo file busy"); - fclose(fp); - return; - } - - if (stat(nm, &stbuf) != 0) { - WriteError("$cannot access \"%s\"",MBSE_SS(nm)); - fclose(fp); - return; - } - - while (!feof(fp) && !ferror(fp)) { - off = ftell(fp); - if (fgets(buf, sizeof(buf)-1, fp) == NULL) - continue; - if (buf[0] == '~') - continue; /* skip sent files */ - if (*(p=buf + strlen(buf) -1) == '\n') - *p-- = '\0'; - if (*p == '\r') - *p = '\0'; - - switch (buf[0]) { - case '#': p=buf+1; disposition=TFS; break; - case '-': - case '^': p=buf+1; disposition=KFS; break; - case '@': p=buf+1; disposition=LEAVE; break; - case 0: continue; - default: p=buf; disposition=LEAVE; break; - } - - memset(&buf2, 0, sizeof(buf2)); - if (strlen(CFG.dospath)) { - if (strncasecmp(p, CFG.dospath, strlen(CFG.dospath)) == 0) { - strcpy(buf2,uxoutbound); - for (p+=strlen(CFG.dospath), q=buf2+strlen(buf2); *p; p++, q++) - *q = ((*p) == '\\')?'/':tolower(*p); - *q = '\0'; - p = buf2; - } -// FIXME: removed because it is useless, but it may break some systems. -// } else { -// if (strncasecmp(p, CFG.uxpath, strlen(CFG.uxpath)) == 0) { -// for (p=p, q=buf2+strlen(buf2); *p; p++, q++) -// *q = ((*p) == '\\')?'/':tolower(*p); -// *q = '\0'; -// p = buf2; -// } - } - - if ((q=strrchr(p,'/'))) - q++; - else - q = p; - add_list(lst, p, q, disposition, off, fp, 1); - } + FILE *fp; + off_t off; + struct flock fl; + char buf[PATH_MAX], buf2[PATH_MAX], *p, *q; + int disposition; + struct stat stbuf; + if ((fp = fopen(nm,"r+")) == NULL) { /* - * Add flo file to file list + * If no flo file, return. */ - add_list(lst, nm, NULL, KFS, -1L, fp, 1); - - /* here, we leave .flo file open, it will be closed by */ - /* execute_disposition */ - return; + } + + Syslog('o', "check_flo(\"%s\")",MBSE_SS(nm)); + + fl.l_type = F_RDLCK; + fl.l_whence = 0; + fl.l_start = 0L; + fl.l_len = 0L; + + if (fcntl(fileno(fp), F_SETLK, &fl) != 0) { + if (errno != EAGAIN) + WriteError("$Can't read-lock \"%s\"", MBSE_SS(nm)); + else + Syslog('o',"flo file busy"); + fclose(fp); + return; + } + + if (stat(nm, &stbuf) != 0) { + WriteError("$Can't access \"%s\"", MBSE_SS(nm)); + fclose(fp); + return; + } + + while (!feof(fp) && !ferror(fp)) { + off = ftell(fp); + if (fgets(buf, sizeof(buf)-1, fp) == NULL) + continue; + if (buf[0] == '~') + continue; /* skip sent files */ + if (*(p=buf + strlen(buf) -1) == '\n') + *p-- = '\0'; + if (*p == '\r') + *p = '\0'; + + switch (buf[0]) { + case '#': p=buf+1; disposition=TFS; break; + case '-': + case '^': p=buf+1; disposition=KFS; break; + case '@': p=buf+1; disposition=LEAVE; break; + case 0: continue; + default: p=buf; disposition=LEAVE; break; + } + + memset(&buf2, 0, sizeof(buf2)); + if (strlen(CFG.dospath)) { + if (strncasecmp(p, CFG.dospath, strlen(CFG.dospath)) == 0) { + strcpy(buf2,uxoutbound); + for (p+=strlen(CFG.dospath), q=buf2+strlen(buf2); *p; p++, q++) + *q = ((*p) == '\\')?'/':tolower(*p); + *q = '\0'; + p = buf2; + } + } + + if ((q=strrchr(p,'/'))) + q++; + else + q = p; + add_list(lst, p, q, disposition, off, fp, 1); + } + + /* + * Add flo file to file list + */ + add_list(lst, nm, NULL, KFS, -1L, fp, 1); + + /* here, we leave .flo file open, it will be closed by */ + /* execute_disposition */ + + return; } file_list *create_filelist(fa_list *al, char *fl, int create) { - file_list *st=NULL; - file_list *tmpf; - fa_list *tmpa; - char flavor, *tmpfl; - char *nm; - char tmpreq[13]; - struct stat stbuf; - int packets = 0; - FILE *fp; - unsigned char buffer[2]; + file_list *st = NULL, *tmpf; + fa_list *tmpa; + char flavor, *tmpfl, *nm, *temp, tmpreq[13]; + struct stat stbuf; + int packets = 0; + FILE *fp; + DIR *dp; + struct dirent *de; + unsigned char buffer[2]; + struct passwd *pw; - Syslog('o', "Create_filelist(%s,\"%s\",%d)", al?ascfnode(al->addr,0x1f):"", MBSE_SS(fl), create); - made_request = 0; + Syslog('o', "Create_filelist(%s,\"%s\",%d)", al?ascfnode(al->addr,0x1f):"", MBSE_SS(fl), create); + made_request = 0; - for (tmpa = al; tmpa; tmpa = tmpa->next) { - Syslog('o', "Check address %s", ascfnode(tmpa->addr, 0x1f)); + for (tmpa = al; tmpa; tmpa = tmpa->next) { + Syslog('o', "Check address %s", ascfnode(tmpa->addr, 0x1f)); - /* - * Check spool files, these are more or less useless but they - * create a filelist of files to send which are never send. - * It gives the transfer protocols something "to do". - */ - if (strchr(fl, 'o')) { - nm = splname(tmpa->addr); - if ((fp = fopen(nm, "w"))) - fclose(fp); - if ((nm != NULL) && (stat(nm, &stbuf) == 0)) - add_list(&st, nm, NULL, DSF, 0L, NULL, 1); - } - - /* - * Check .pol files - */ - nm = polname(tmpa->addr); - if ((nm != NULL) && (stat(nm,&stbuf) == 0)) - add_list(&st,nm,NULL,DSF,0L,NULL,1); - - /* - * Check other files, all flavors - */ - tmpfl = fl; - while ((flavor = *tmpfl++)) { - /* - * Check normal mail packets - */ - nm = pktname(tmpa->addr,flavor); - if ((nm != NULL) && (stat(nm,&stbuf) == 0)) { - packets++; - add_list(&st, nm, tmpkname(), KFS, 0L, NULL, 1); - } - - /* - * Check .flo files for file attaches - */ - nm = floname(tmpa->addr,flavor); - check_flo(&st, nm); - } - - if ((session_flags & SESSION_WAZOO) && - ((session_flags & SESSION_HYDRA) == 0) && (master || ((session_flags & SESSION_IFNA) == 0))) { - /* - * we don't distinguish flavoured reqs - */ - nm = reqname(tmpa->addr); - if ((nm != NULL) && (stat(nm, &stbuf) == 0)) { - sprintf(tmpreq, "%04X%04X.REQ", tmpa->addr->net, tmpa->addr->node); - add_list(&st, nm, tmpreq, DSF, 0L, NULL, 1); - made_request = 1; + /* + * For the main aka, check the outbox. + */ + if ((tmpa->addr) && Loaded && strlen(nodes.OutBox) && + (tmpa->addr->zone == nodes.Aka[0].zone) && (tmpa->addr->net == nodes.Aka[0].net) && + (tmpa->addr->node == nodes.Aka[0].node) && (tmpa->addr->point == nodes.Aka[0].point)) { + Syslog('o', "checking outbox %s", nodes.OutBox); + if (nodes.Crash) + flavor = 'c'; + else if (nodes.Hold) + flavor = 'h'; + else + flavor = 'o'; + if ((dp = opendir(nodes.OutBox)) == NULL) { + Syslog('o', "\"%s\" cannot be opened, proceed", MBSE_SS(nodes.OutBox)); + } else { + temp = calloc(PATH_MAX, sizeof(char)); + pw = getpwnam((char *)"mbse"); + while ((de = readdir(dp))) { + if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { + sprintf(temp, "%s/%s", nodes.OutBox, de->d_name); + if (stat(temp, &stbuf) == 0) { + Syslog('o' ,"checking file \"%s\"", de->d_name); + if (S_ISREG(stbuf.st_mode)) { + if (pw->pw_uid == stbuf.st_uid) { + /* + * We own the file + */ + if ((stbuf.st_mode & S_IRUSR) && (stbuf.st_mode & S_IWUSR)) { + add_list(&st, temp, de->d_name, KFS, 0L, NULL, 1); + } else { + Syslog('+', "No R/W permission on %s", temp); + } + } else if (pw->pw_gid == stbuf.st_gid) { + /* + * We own the file group + */ + if ((stbuf.st_mode & S_IRGRP) && (stbuf.st_mode & S_IWGRP)) { + add_list(&st, temp, de->d_name, KFS, 0L, NULL, 1); + } else { + Syslog('+', "No R/W permission on %s", temp); + } + } else { + /* + * No owner of file + */ + if ((stbuf.st_mode & S_IROTH) && (stbuf.st_mode & S_IWOTH)) { + add_list(&st, temp, de->d_name, KFS, 0L, NULL, 1); + } else { + Syslog('+', "No R/W permission on %s", temp); + } + } + } else { + Syslog('+', "Not a regular file %s", temp); + } + } else { + WriteError("Can't stat %s", temp); } + } } + closedir(dp); + free(temp); + } } - if (((st == NULL) && (create > 1)) || ((st != NULL) && (packets == 0) && (create > 0))) { - Syslog('o', "Create packet for %s", ascfnode(al->addr,0x1f)); - if ((fp = openpkt(NULL, al->addr, 'o'))) { - memset(&buffer, 0, sizeof(buffer)); - fwrite(buffer, 1, 2, fp); - fclose(fp); - } - add_list(&st, pktname(al->addr,'o'), tmpkname(), KFS, 0L, NULL, 0); + /* + * Check spool files, these are more or less useless but they + * create a filelist of files to send which are never send. + * It gives the transfer protocols something "to do". + */ + if (strchr(fl, 'o')) { + nm = splname(tmpa->addr); + if ((fp = fopen(nm, "w"))) + fclose(fp); + if ((nm != NULL) && (stat(nm, &stbuf) == 0)) + add_list(&st, nm, NULL, DSF, 0L, NULL, 1); } - for (tmpf = st; tmpf; tmpf = tmpf->next) - Syslog('O',"flist: \"%s\" -> \"%s\" dsp:%d flofp:%lu floff:%lu", - MBSE_SS(tmpf->local), MBSE_SS(tmpf->remote), tmpf->disposition, - (unsigned long)tmpf->flofp, (unsigned long)tmpf->floff); + /* + * Check .pol files + */ + nm = polname(tmpa->addr); + if ((nm != NULL) && (stat(nm,&stbuf) == 0)) + add_list(&st,nm,NULL,DSF,0L,NULL,1); - return st; + /* + * Check other files, all flavors + */ + tmpfl = fl; + while ((flavor = *tmpfl++)) { + /* + * Check normal mail packets + */ + nm = pktname(tmpa->addr,flavor); + if ((nm != NULL) && (stat(nm,&stbuf) == 0)) { + packets++; + add_list(&st, nm, tmpkname(), KFS, 0L, NULL, 1); + } + + /* + * Check .flo files for file attaches + */ + nm = floname(tmpa->addr,flavor); + check_flo(&st, nm); + } + + if ((session_flags & SESSION_WAZOO) && + ((session_flags & SESSION_HYDRA) == 0) && (master || ((session_flags & SESSION_IFNA) == 0))) { + /* + * we don't distinguish flavoured reqs + */ + nm = reqname(tmpa->addr); + if ((nm != NULL) && (stat(nm, &stbuf) == 0)) { + sprintf(tmpreq, "%04X%04X.REQ", tmpa->addr->net, tmpa->addr->node); + add_list(&st, nm, tmpreq, DSF, 0L, NULL, 1); + made_request = 1; + } + } + } + + if (((st == NULL) && (create > 1)) || ((st != NULL) && (packets == 0) && (create > 0))) { + Syslog('o', "Create packet for %s", ascfnode(al->addr,0x1f)); + if ((fp = openpkt(NULL, al->addr, 'o'))) { + memset(&buffer, 0, sizeof(buffer)); + fwrite(buffer, 1, 2, fp); + fclose(fp); + } + add_list(&st, pktname(al->addr,'o'), tmpkname(), KFS, 0L, NULL, 0); + } + + for (tmpf = st; tmpf; tmpf = tmpf->next) + Syslog('o',"flist: \"%s\" -> \"%s\" dsp:%d flofp:%lu floff:%lu", + MBSE_SS(tmpf->local), MBSE_SS(tmpf->remote), tmpf->disposition, + (unsigned long)tmpf->flofp, (unsigned long)tmpf->floff); + + return st; } @@ -320,157 +381,154 @@ file_list *create_filelist(fa_list *al, char *fl, int create) */ file_list *create_freqlist(fa_list *al) { - file_list *st = NULL, *tmpf; - fa_list *tmpa; - char *nm; - char tmpreq[13]; - struct stat stbuf; + file_list *st = NULL, *tmpf; + fa_list *tmpa; + char *nm, tmpreq[13]; + struct stat stbuf; - Syslog('o', "create_freqlist(%s)", al?ascfnode(al->addr, 0x1f):""); - made_request = 0; + Syslog('o', "create_freqlist(%s)", al?ascfnode(al->addr, 0x1f):""); + made_request = 0; - for (tmpa = al; tmpa; tmpa = tmpa->next) { - nm = reqname(tmpa->addr); - if ((nm != NULL) && (stat(nm, &stbuf) == 0)) { - sprintf(tmpreq, "%04X%04X.REQ", tmpa->addr->net, tmpa->addr->node); - add_list(&st, nm, tmpreq, DSF, 0L, NULL, 1); - made_request = 1; - } + for (tmpa = al; tmpa; tmpa = tmpa->next) { + nm = reqname(tmpa->addr); + if ((nm != NULL) && (stat(nm, &stbuf) == 0)) { + sprintf(tmpreq, "%04X%04X.REQ", tmpa->addr->net, tmpa->addr->node); + add_list(&st, nm, tmpreq, DSF, 0L, NULL, 1); + made_request = 1; } + } + if (made_request) { for (tmpf = st; tmpf; tmpf = tmpf->next) - Syslog('O', "flist: \"%s\" -> \"%s\" dsp:%d flofp:%lu floff:%lu", - MBSE_SS(tmpf->local), MBSE_SS(tmpf->remote), tmpf->disposition, - tmpf->flofp, tmpf->floff); + Syslog('o', "flist: \"%s\" -> \"%s\" dsp:%d flofp:%lu floff:%lu", + MBSE_SS(tmpf->local), MBSE_SS(tmpf->remote), tmpf->disposition, tmpf->flofp, tmpf->floff); + } - return st; + return st; } void tidy_filelist(file_list *fl, int dsf) { - file_list *tmp; + file_list *tmp; - if (fl == NULL) - return; - - for (tmp=fl;fl;fl=tmp) { - tmp=fl->next; - if (dsf && (fl->disposition == DSF)) { - Syslog('o',"Removing sent file \"%s\"",MBSE_SS(fl->local)); - if (unlink(fl->local) != 0) { - if (errno == ENOENT) - Syslog('o',"Cannot unlink nonexistent file \"%s\"", MBSE_SS(fl->local)); - else - WriteError("$Cannot unlink file \"%s\"", MBSE_SS(fl->local)); - } - } - if (fl->local) - free(fl->local); - if (fl->remote) - free(fl->remote); - else if (fl->flofp) - fclose(fl->flofp); - free(fl); - } + if (fl == NULL) return; + + for (tmp=fl;fl;fl=tmp) { + tmp=fl->next; + if (dsf && (fl->disposition == DSF)) { + Syslog('o',"Removing sent file \"%s\"",MBSE_SS(fl->local)); + if (unlink(fl->local) != 0) { + if (errno == ENOENT) + Syslog('o',"Cannot unlink nonexistent file \"%s\"", MBSE_SS(fl->local)); + else + WriteError("$Cannot unlink file \"%s\"", MBSE_SS(fl->local)); + } + } + if (fl->local) + free(fl->local); + if (fl->remote) + free(fl->remote); + else if (fl->flofp) + fclose(fl->flofp); + free(fl); + } + return; } void execute_disposition(file_list *fl) { - FILE *fp=NULL; - char *nm; - char tpl='~'; + FILE *fp=NULL; + char *nm, tpl='~'; - Syslog('o', "execute_disposition(%s)", fl->local); - nm = fl->local; - if (fl->flofp) { - /* - * Check for special case: flo-file - */ - if (fl->floff == -1) { - /* - * We check if there are any files left for transmission - * in the flo-file to decide whether to remove or leave - * it on disk. - */ - char buf[PATH_MAX]; - int files_remain = 0; + Syslog('o', "execute_disposition(%s)", fl->local); + nm = fl->local; + if (fl->flofp) { + /* + * Check for special case: flo-file + */ + if (fl->floff == -1) { + /* + * We check if there are any files left for transmission + * in the flo-file to decide whether to remove or leave + * it on disk. + */ + char buf[PATH_MAX]; + int files_remain = 0; - if (fseek(fl->flofp, 0L, 0) == 0) { - while (!feof(fl->flofp) && !ferror(fl->flofp)) { - if (fgets(buf, sizeof(buf)-1, fl->flofp) == NULL) - continue; + if (fseek(fl->flofp, 0L, 0) == 0) { + while (!feof(fl->flofp) && !ferror(fl->flofp)) { + if (fgets(buf, sizeof(buf)-1, fl->flofp) == NULL) + continue; - /* - * Count nr of files which haven't been - * sent yet - */ - if (buf[0] != '~') - files_remain++; - } + /* + * Count nr of files which haven't been sent yet + */ + if (buf[0] != '~') + files_remain++; + } - } else { - WriteError("$Error seeking in .flo to 0"); - files_remain = -1; /* Keep flo-file */ - } + } else { + WriteError("$Error seeking in .flo to 0"); + files_remain = -1; /* Keep flo-file */ + } - if (files_remain) { - Syslog('o', "Leaving flo-file \"%s\", %d files remaining", MBSE_SS(nm), files_remain); - fl->disposition = LEAVE; - } else { - fl->disposition = KFS; - } - } else { - /* - * Mark files as sent in flo-file - */ - if (fseek(fl->flofp, fl->floff, 0) == 0) { - if (fwrite(&tpl,1,1,fl->flofp) != 1) { - WriteError("$Error writing '~' to .flo at %lu", (unsigned long)fl->floff); - } - fflush(fl->flofp); + if (files_remain) { + Syslog('o', "Leaving flo-file \"%s\", %d files remaining", MBSE_SS(nm), files_remain); + fl->disposition = LEAVE; + } else { + fl->disposition = KFS; + } + } else { + /* + * Mark files as sent in flo-file + */ + if (fseek(fl->flofp, fl->floff, 0) == 0) { + if (fwrite(&tpl,1,1,fl->flofp) != 1) { + WriteError("$Error writing '~' to .flo at %lu", (unsigned long)fl->floff); + } + fflush(fl->flofp); #ifdef HAVE_FDATASYNC - fdatasync(fileno(fl->flofp)); + fdatasync(fileno(fl->flofp)); #else #ifdef HAVE_FSYNC - fsync(fileno(fl->flofp)); + fsync(fileno(fl->flofp)); #endif #endif - } else - WriteError("$error seeking in .flo to %lu", (unsigned long)fl->floff); - } + } else + WriteError("$error seeking in .flo to %lu", (unsigned long)fl->floff); } + } - switch (fl->disposition) { + switch (fl->disposition) { case DSF: - case LEAVE: - break; - case TFS: - Syslog('o', "Truncating sent file \"%s\"",MBSE_SS(nm)); - if ((fp=fopen(nm,"w"))) - fclose(fp); - else - WriteError("$Cannot truncate file \"%s\"",MBSE_SS(nm)); - break; - case KFS: - Syslog('o', "Removing sent file \"%s\"",MBSE_SS(nm)); - if (unlink(nm) != 0) { - if (errno == ENOENT) - Syslog('o', "Cannot unlink nonexistent file \"%s\"", MBSE_SS(nm)); - else - WriteError("$Cannot unlink file \"%s\"", MBSE_SS(nm)); - } - break; - default: WriteError("execute_disposition: unknown disp %d for \"%s\"", - fl->disposition,MBSE_SS(nm)); - break; - } + case LEAVE: break; - return; + case TFS: Syslog('o', "Truncating sent file \"%s\"",MBSE_SS(nm)); + if ((fp=fopen(nm,"w"))) + fclose(fp); + else + WriteError("$Cannot truncate file \"%s\"",MBSE_SS(nm)); + break; + + case KFS: Syslog('o', "Removing sent file \"%s\"",MBSE_SS(nm)); + if (unlink(nm) != 0) { + if (errno == ENOENT) + Syslog('o', "Cannot unlink nonexistent file \"%s\"", MBSE_SS(nm)); + else + WriteError("$Cannot unlink file \"%s\"", MBSE_SS(nm)); + } + break; + + default: WriteError("execute_disposition: unknown disp %d for \"%s\"", fl->disposition,MBSE_SS(nm)); + break; + } + + return; } diff --git a/mbcico/outstat.c b/mbcico/outstat.c index d0291625..4d62f7c3 100644 --- a/mbcico/outstat.c +++ b/mbcico/outstat.c @@ -66,55 +66,138 @@ static struct _alist int outstat() { - int rc; - struct _alist *tmp, *old; - char flstr[6]; - time_t age; - char temp[81]; - callstat *cst; + int rc; + struct _alist *tmp, *old; + char flstr[6], *temp, flavor; + time_t age; + faddr *fa; + callstat *cst; + FILE *fp; + DIR *dp = NULL; + struct dirent *de; + struct stat sb; + struct passwd *pw; - if ((rc = scanout(each))) { - WriteError("Error scanning outbound, aborting"); - return rc; - } + if ((rc = scanout(each))) { + WriteError("Error scanning outbound, aborting"); + return rc; + } - if (!do_quiet) { - colour(10, 0); - printf("flavor try size age address\n"); - colour(3, 0); - } + /* + * Check private outbound box for nodes in the setup. + */ + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s/etc/nodes.data", getenv("MBSE_ROOT")); + if ((fp = fopen(temp, "r")) == NULL) { + WriteError("Error open %s, aborting", temp); + free(temp); + return 1; + } + fread(&nodeshdr, sizeof(nodeshdr), 1, fp); + fseek(fp, 0, SEEK_SET); + fread(&nodeshdr, nodeshdr.hdrsize, 1, fp); + pw = getpwnam((char *)"mbse"); - Syslog('+', "Flavor Try Size Age Address"); - for (tmp = alist; tmp; tmp = tmp->next) { - if ((tmp->flavors & F_FREQ) || (tmp->size) || 1) { - strcpy(flstr,"......"); - if ((tmp->flavors) & F_IMM ) flstr[0]='I'; - if ((tmp->flavors) & F_CRASH ) flstr[1]='C'; - if ((tmp->flavors) & F_NORMAL) flstr[2]='N'; - if ((tmp->flavors) & F_HOLD ) flstr[3]='H'; - if ((tmp->flavors) & F_FREQ ) flstr[4]='R'; - if ((tmp->flavors) & F_POLL ) flstr[5]='P'; - - cst = getstatus(&(tmp->addr)); - age = time(NULL); - age -= tmp->time; - sprintf(temp, "%s %3d %9lu %s %s", flstr, cst->tryno, (long)tmp->size, - str_time(age), ascfnode(&(tmp->addr), 0x1f)); - - if (!do_quiet) - printf("%s\n", temp); - Syslog('+', "%s", temp); + while ((fread(&nodes, nodeshdr.recsize, 1, fp)) == 1) { + if (strlen(nodes.OutBox)) { + if (nodes.Crash) + flavor = 'c'; + else if (nodes.Hold) + flavor = 'h'; + else + flavor = 'o'; + fa = fido2faddr(nodes.Aka[0]); + Syslog('o', "checking outbox %s (%s)", nodes.OutBox, ascfnode(fa, 0x2f)); + if ((dp = opendir(nodes.OutBox)) == NULL) { + Syslog('o', "\"%s\" cannot be opened, proceed", MBSE_SS(nodes.OutBox)); + } else { + while ((de = readdir(dp))) { + if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { + sprintf(temp, "%s/%s", nodes.OutBox, de->d_name); + if (stat(temp, &sb) == 0) { + Syslog('o' ,"checking: \"%s\"", de->d_name); + if (S_ISREG(sb.st_mode)) { + if (pw->pw_uid == sb.st_uid) { + /* + * We own the file + */ + if ((sb.st_mode & S_IRUSR) && (sb.st_mode & S_IWUSR)) { + each(fa, flavor, 0, temp); + } else { + Syslog('o', "no R/W permission on %s", temp); + } + } else if (pw->pw_gid == sb.st_gid) { + /* + * We own the file group + */ + if ((sb.st_mode & S_IRGRP) && (sb.st_mode & S_IWGRP)) { + each(fa, flavor, 0, temp); + } else { + Syslog('o', "no R/W permission on %s", temp); + } + } else { + /* + * No owner of file + */ + if ((sb.st_mode & S_IROTH) && (sb.st_mode & S_IWOTH)) { + each(fa, flavor, 0, temp); + } else { + Syslog('o', "no R/W permission on %s", temp); + } + } + } else { + Syslog('o', "not a regular file"); + } + } else { + WriteError("Can't stat %s", temp); + } + } } + closedir(dp); + } + tidy_faddr(fa); } + fseek(fp, nodeshdr.filegrp + nodeshdr.mailgrp, SEEK_CUR); + } + fclose(fp); - for (tmp = alist; tmp; tmp = old) { - old = tmp->next; - free(tmp->addr.domain); - free(tmp); + if (!do_quiet) { + colour(10, 0); + printf("flavor try size age address\n"); + colour(3, 0); + } + + Syslog('+', "Flavor Try Size Age Address"); + for (tmp = alist; tmp; tmp = tmp->next) { + if ((tmp->flavors & F_FREQ) || (tmp->size) || 1) { + strcpy(flstr,"......"); + if ((tmp->flavors) & F_IMM ) flstr[0]='I'; + if ((tmp->flavors) & F_CRASH ) flstr[1]='C'; + if ((tmp->flavors) & F_NORMAL) flstr[2]='N'; + if ((tmp->flavors) & F_HOLD ) flstr[3]='H'; + if ((tmp->flavors) & F_FREQ ) flstr[4]='R'; + if ((tmp->flavors) & F_POLL ) flstr[5]='P'; + + cst = getstatus(&(tmp->addr)); + age = time(NULL); + age -= tmp->time; + sprintf(temp, "%s %3d %9lu %s %s", flstr, cst->tryno, (long)tmp->size, str_time(age), ascfnode(&(tmp->addr), 0x1f)); + + if (!do_quiet) + printf("%s\n", temp); + Syslog('+', "%s", temp); } - alist = NULL; + } - return 0; + free(temp); + for (tmp = alist; tmp; tmp = old) { + old = tmp->next; + free(tmp->addr.domain); + free(tmp); + } + alist = NULL; + + return 0; } @@ -126,6 +209,8 @@ int each(faddr *addr, char flavor, int isflo, char *fname) FILE *fp; char buf[256], *p; + Syslog('o', "each(%s, %c, %s, %s)", ascfnode(addr, 0x2f), flavor, isflo?"isflo":"noflo", fname); + if ((isflo != OUT_PKT) && (isflo != OUT_FLO) && (isflo != OUT_REQ) && (isflo != OUT_POL)) return 0; diff --git a/mbcico/scanout.c b/mbcico/scanout.c index 24c7728f..094b1c75 100644 --- a/mbcico/scanout.c +++ b/mbcico/scanout.c @@ -57,121 +57,118 @@ extern time_t t_start; static int scan_dir(int (*)(faddr*,char,int,char*),char*,int); static int scan_dir(int (*fn)(faddr *, char, int, char *), char *dname, int ispoint) { - char fname[PATH_MAX]; - char flavor = '?'; - DIR *dp = NULL; - struct dirent *de; - int rc = 0, isflo, fage; + char fname[PATH_MAX]; + char flavor = '?'; + DIR *dp = NULL; + struct dirent *de; + int rc = 0, isflo, fage; - Syslog('o' ,"scan_dir \"%s\" (%s)",MBSE_SS(dname),ispoint?"point":"node"); + Syslog('o' ,"scan_dir \"%s\" (%s)",MBSE_SS(dname),ispoint?"point":"node"); + if ((dp = opendir(dname)) == NULL) { + Syslog('-', "Creating directory %s", dname); + /* + * Create a fake filename, mkdirs() likes that. + */ + sprintf(fname, "%s/foo", dname); + (void)mkdirs(fname, 0770); if ((dp = opendir(dname)) == NULL) { - Syslog('-', "Creating directory %s", dname); - /* - * Create a fake filename, mkdirs() likes that. - */ - sprintf(fname, "%s/foo", dname); - (void)mkdirs(fname, 0770); - if ((dp = opendir(dname)) == NULL) { - Syslog('o' ,"\"%s\" cannot be opened, proceed",MBSE_SS(dname)); - return 0; - } + Syslog('o' ,"\"%s\" cannot be opened, proceed",MBSE_SS(dname)); + return 0; } + } - while ((de=readdir(dp))) - if ((strlen(de->d_name) == 12) && (de->d_name[8] == '.') && - (strspn(de->d_name,"0123456789abcdefABCDEF") == 8)) { - Syslog('o' ,"checking: \"%s\"",de->d_name); - addr.point= 0; - strncpy(fname,dname,PATH_MAX-2); - strcat(fname,"/"); - strncat(fname,de->d_name,PATH_MAX-strlen(fname)-2); + while ((de=readdir(dp))) + if ((strlen(de->d_name) == 12) && (de->d_name[8] == '.') && (strspn(de->d_name,"0123456789abcdefABCDEF") == 8)) { + Syslog('o' ,"checking: \"%s\"",de->d_name); + addr.point= 0; + strncpy(fname,dname,PATH_MAX-2); + strcat(fname,"/"); + strncat(fname,de->d_name,PATH_MAX-strlen(fname)-2); - if ((strcasecmp(de->d_name+9,"pnt") == 0) && !ispoint) { + if ((strcasecmp(de->d_name+9,"pnt") == 0) && !ispoint) { sscanf(de->d_name,"%04x%04x",&addr.net,&addr.node); if ((rc = scan_dir(fn, fname, 1))) goto exout; - } else if ((strcasecmp(de->d_name+8,".out") == 0) || - (strcasecmp(de->d_name+8,".cut") == 0) || - (strcasecmp(de->d_name+8,".hut") == 0) || - (strcasecmp(de->d_name+8,".iut") == 0) || - (strcasecmp(de->d_name+8,".opk") == 0) || - (strcasecmp(de->d_name+8,".cpk") == 0) || - (strcasecmp(de->d_name+8,".hpk") == 0) || - (strcasecmp(de->d_name+8,".ipk") == 0) || - (strcasecmp(de->d_name+8,".flo") == 0) || - (strcasecmp(de->d_name+8,".clo") == 0) || - (strcasecmp(de->d_name+8,".hlo") == 0) || - (strcasecmp(de->d_name+8,".ilo") == 0) || - (strcasecmp(de->d_name+8,".req") == 0) || - (strcasecmp(de->d_name+8,".pol") == 0)) { - if (ispoint) - sscanf(de->d_name,"%08x", &addr.point); - else - sscanf(de->d_name,"%04x%04x", &addr.net,&addr.node); - flavor = tolower(de->d_name[9]); - if (flavor == 'f') - flavor='o'; - if (strcasecmp(de->d_name+10,"ut") == 0) - isflo=OUT_PKT; - else if (strcasecmp(de->d_name+10,"pk") == 0) - isflo=OUT_DIR; - else if (strcasecmp(de->d_name+10,"lo") == 0) - isflo=OUT_FLO; - else if (strcasecmp(de->d_name+9,"req") == 0) - isflo=OUT_REQ; - else if (strcasecmp(de->d_name+9,"pol") == 0) - isflo=OUT_POL; - else - isflo=-1; - Syslog('o' ,"%s \"%s\"", - (isflo == OUT_FLO) ? "flo file" : "packet", - de->d_name); - if ((rc=fn(&addr,flavor,isflo,fname))) - goto exout; - } else if ((strncasecmp(de->d_name+9,"su",2) == 0) || - (strncasecmp(de->d_name+9,"mo",2) == 0) || - (strncasecmp(de->d_name+9,"tu",2) == 0) || - (strncasecmp(de->d_name+9,"we",2) == 0) || - (strncasecmp(de->d_name+9,"th",2) == 0) || - (strncasecmp(de->d_name+9,"fr",2) == 0) || - (strncasecmp(de->d_name+9,"sa",2) == 0)) { - isflo = OUT_ARC; - if ((rc = fn(&addr, flavor, isflo, fname))) - goto exout; + } else if ((strcasecmp(de->d_name+8,".out") == 0) || + (strcasecmp(de->d_name+8,".cut") == 0) || + (strcasecmp(de->d_name+8,".hut") == 0) || + (strcasecmp(de->d_name+8,".iut") == 0) || + (strcasecmp(de->d_name+8,".opk") == 0) || + (strcasecmp(de->d_name+8,".cpk") == 0) || + (strcasecmp(de->d_name+8,".hpk") == 0) || + (strcasecmp(de->d_name+8,".ipk") == 0) || + (strcasecmp(de->d_name+8,".flo") == 0) || + (strcasecmp(de->d_name+8,".clo") == 0) || + (strcasecmp(de->d_name+8,".hlo") == 0) || + (strcasecmp(de->d_name+8,".ilo") == 0) || + (strcasecmp(de->d_name+8,".req") == 0) || + (strcasecmp(de->d_name+8,".pol") == 0)) { + if (ispoint) + sscanf(de->d_name,"%08x", &addr.point); + else + sscanf(de->d_name,"%04x%04x", &addr.net,&addr.node); + flavor = tolower(de->d_name[9]); + if (flavor == 'f') + flavor='o'; + if (strcasecmp(de->d_name+10,"ut") == 0) + isflo=OUT_PKT; + else if (strcasecmp(de->d_name+10,"pk") == 0) + isflo=OUT_DIR; + else if (strcasecmp(de->d_name+10,"lo") == 0) + isflo=OUT_FLO; + else if (strcasecmp(de->d_name+9,"req") == 0) + isflo=OUT_REQ; + else if (strcasecmp(de->d_name+9,"pol") == 0) + isflo=OUT_POL; + else + isflo=-1; + Syslog('o' ,"%s \"%s\"", (isflo == OUT_FLO) ? "flo file" : "packet", de->d_name); + if ((rc=fn(&addr,flavor,isflo,fname))) + goto exout; + } else if ((strncasecmp(de->d_name+9,"su",2) == 0) || + (strncasecmp(de->d_name+9,"mo",2) == 0) || + (strncasecmp(de->d_name+9,"tu",2) == 0) || + (strncasecmp(de->d_name+9,"we",2) == 0) || + (strncasecmp(de->d_name+9,"th",2) == 0) || + (strncasecmp(de->d_name+9,"fr",2) == 0) || + (strncasecmp(de->d_name+9,"sa",2) == 0)) { + isflo = OUT_ARC; + if ((rc = fn(&addr, flavor, isflo, fname))) + goto exout; - Syslog('o' ,"arcmail file \"%s\"",de->d_name); - sprintf(fname, "%s/%s", dname, de->d_name); - fage = (int)((t_start - file_time(fname)) / 86400); + Syslog('o' ,"arcmail file \"%s\"",de->d_name); + sprintf(fname, "%s/%s", dname, de->d_name); + fage = (int)((t_start - file_time(fname)) / 86400); - if (file_size(fname) == 0) { - Syslog('o', "Age %d days", fage); - /* - * Remove truncated ARCmail that has a day extension - * other then the current day or if the file is older - * then 6 days. - */ - if ((strncasecmp(de->d_name+9, dayname(), 2)) || (fage > 6)) { - if (unlink(fname) == 0) - Syslog('-', "Removed truncated ARCmail file %s", fname); - } - } - - if (CFG.toss_days && (fage > CFG.toss_days)) { - /* - * Remove ARCmail that is on hold too long. - */ - if (unlink(fname) == 0) - Syslog('+', "Removed ARCmail %s, %d days", fname, fage); - } - } else { - Syslog('o' ,"skipping \"%s\"",de->d_name); + if (file_size(fname) == 0) { + Syslog('o', "Age %d days", fage); + /* + * Remove truncated ARCmail that has a day extension + * other then the current day or if the file is older + * then 6 days. + */ + if ((strncasecmp(de->d_name+9, dayname(), 2)) || (fage > 6)) { + if (unlink(fname) == 0) + Syslog('+', "Removed truncated ARCmail file %s", fname); } + } + + if (CFG.toss_days && (fage > CFG.toss_days)) { + /* + * Remove ARCmail that is on hold too long. + */ + if (unlink(fname) == 0) + Syslog('+', "Removed ARCmail %s, %d days", fname, fage); + } + } else { + Syslog('o' ,"skipping \"%s\"",de->d_name); } + } exout: - closedir(dp); - return rc; + closedir(dp); + return rc; } diff --git a/mbsetup/grlist.c b/mbsetup/grlist.c index 4fa148d2..3eb7df5b 100644 --- a/mbsetup/grlist.c +++ b/mbsetup/grlist.c @@ -125,7 +125,7 @@ int E_Group(gr_list **fdp, char *title) clr_index(); set_color(WHITE, BLACK); - mvprintw(5, 5, (char *)"%s", title); + mvprintw(5, 6, (char *)"%s", title); set_color(CYAN, BLACK); for (tmp = *fdp; tmp; tmp = tmp->next) diff --git a/mbsetup/ledit.c b/mbsetup/ledit.c index 27dbd849..db377bd7 100644 --- a/mbsetup/ledit.c +++ b/mbsetup/ledit.c @@ -716,7 +716,7 @@ char *edit_str(int y, int x, int l, char *line, char *help) -char *edit_pth(int y, int x, int l, char *line, char *help) +char *edit_pth(int y, int x, int l, char *line, char *help, mode_t mode) { static char s[256]; char *temp; @@ -729,7 +729,7 @@ char *edit_pth(int y, int x, int l, char *line, char *help) temp = xstrcat(temp, (char *)"/foobar"); if (access(s, R_OK)) { if (yes_no((char *)"Path doesn't exist, create")) - if (! mkdirs(temp, 0775)) + if (! mkdirs(temp, mode)) errmsg((char *)"Can't create path"); } } @@ -1723,6 +1723,95 @@ char *getmagictype(int val) +char *get_sessiontype(int val) +{ + switch (val) { + case S_DIRECT: return (char *)"Direct "; + case S_DIR: return (char *)"Directory"; + case S_FTP: return (char *)"FTP "; + default: return NULL; + } +} + + + +void show_sessiontype(int y, int x, int val) +{ + mvprintw(y, x, get_sessiontype(val)); +} + + + +int edit_sessiontype(int y, int x, int val) +{ + int ch; + + showhelp((char *)"Toggle ^Session type^ with spacebar, press whene done."); + do { + set_color(YELLOW, BLUE); + show_sessiontype(y, x, val); + + ch = readkey(y, x, YELLOW, BLUE); + + if (ch == ' ') { + if (val < S_FTP) + val++; + else + val = S_DIRECT; + } + } while (ch != KEY_ENTER && ch != '\012'); + set_color(WHITE, BLACK); + show_sessiontype(y, x, val); + return val; +} + + + +char *get_routertype(int val) +{ + switch (val) { + case R_ROUTE: return (char *)"Routed "; + case R_NEWDEST: return (char *)"Redirect "; + case R_BOUNCE: return (char *)"Bounce "; + case R_CC: return (char *)"CarbonCopy"; + default: return NULL; + } +} + + + +void show_routertype(int y, int x, int val) +{ + mvprintw(y, x, get_routertype(val)); +} + + + +int edit_routertype(int y, int x, int val) +{ + int ch; + + showhelp((char *)"Toggle ^Routing mode^ with spacebar, press whene done."); + do { + set_color(YELLOW, BLUE); + show_routertype(y, x, val); + + ch = readkey(y, x, YELLOW, BLUE); + + if (ch == ' ') { + if (val < R_CC) + val++; + else + val = R_ROUTE; + } + } while (ch != KEY_ENTER && ch != '\012'); + set_color(WHITE, BLACK); + show_routertype(y, x, val); + return val; +} + + + void show_aka(int y, int x, fidoaddr aka) { char temp[24]; diff --git a/mbsetup/ledit.h b/mbsetup/ledit.h index 09a63668..472ec4cd 100644 --- a/mbsetup/ledit.h +++ b/mbsetup/ledit.h @@ -20,7 +20,7 @@ int select_menu(int); int select_tag(int); void show_str(int, int, int, char *); char *edit_str(int, int, int, char *, char *); -char *edit_pth(int, int, int, char *, char *); +char *edit_pth(int, int, int, char *, char *, mode_t); void test_jam(char *); char *edit_jam(int, int, int, char *, char *); char *edit_ups(int, int, int, char *, char *); @@ -67,6 +67,12 @@ int edit_linetype(int, int, int); char *getmagictype(int); void show_magictype(int, int, int); int edit_magictype(int, int, int); +char *get_sessiontype(int); +void show_sessiontype(int, int, int); +int edit_sessiontype(int, int, int); +char *get_routetype(int); +void show_routetype(int, int, int); +int edit_routetype(int, int, int); void show_aka(int, int, fidoaddr); void edit_color(int *, int *, char *, char *); char *get_color(int); @@ -77,7 +83,7 @@ char *getmenutype(int); * Macro's for the edit functions */ #define E_STR(y,x,l,str,help) strcpy(str, edit_str(y,x,l,str,(char *)help)); break; -#define E_PTH(y,x,l,str,help) strcpy(str, edit_pth(y,x,l,str,(char *)help)); break; +#define E_PTH(y,x,l,str,help,mode) strcpy(str, edit_pth(y,x,l,str,(char *)help,mode)); break; #define E_UPS(y,x,l,str,help) strcpy(str, edit_ups(y,x,l,str,(char *)help)); break; #define E_JAM(y,x,l,str,help) strcpy(str, edit_jam(y,x,l,str,(char *)help)); break; #define E_BOOL(y,x,bool,help) bool = edit_bool(y,x,bool,(char *)help); break; diff --git a/mbsetup/m_farea.c b/mbsetup/m_farea.c index ce82c004..805dd339 100644 --- a/mbsetup/m_farea.c +++ b/mbsetup/m_farea.c @@ -332,7 +332,7 @@ int EditFileRec(int Area) return 0; case 1: E_STR( 6,16,44, area.Name, "The ^name^ for this area") case 2: strcpy(tpath, area.Path); - strcpy(area.Path, edit_pth(7,16,64, area.Path, (char *)"The ^path^ for the files in this area")); + strcpy(area.Path, edit_pth(7,16,64, area.Path, (char *)"The ^path^ for the files in this area", 0775)); if (strlen(tpath) && strlen(area.Path) && strcmp(tpath, area.Path) && strcmp(tpath, CFG.ftp_base)) { if ((dp = opendir(tpath)) == NULL) { WriteError("Can't open directory %s", tpath); diff --git a/mbsetup/m_fgroup.c b/mbsetup/m_fgroup.c index 8db14cae..df6967e4 100644 --- a/mbsetup/m_fgroup.c +++ b/mbsetup/m_fgroup.c @@ -420,7 +420,7 @@ int EditFGrpRec(int Area) strcpy(fgroup.BbsGroup, fgroup.Name); break; case 2: E_STR( 7,16,55,fgroup.Comment, "The ^description^ of this file group") - case 3: E_PTH( 8,16,64,fgroup.BasePath, "The ^base path^ for new created file areas") + case 3: E_PTH( 8,16,64,fgroup.BasePath, "The ^base path^ for new created file areas", 0775) case 4: tmp = PickAka((char *)"10.1.4", TRUE); if (tmp != -1) fgroup.UseAka = CFG.aka[tmp]; diff --git a/mbsetup/m_global.c b/mbsetup/m_global.c index d417f472..c90adbf0 100644 --- a/mbsetup/m_global.c +++ b/mbsetup/m_global.c @@ -240,12 +240,12 @@ void e_global2(void) switch(select_menu(7)) { case 0: return; - case 1: E_PTH( 6,16,64, CFG.req_magic, "The path to the ^magic filerequest^ files.") + case 1: E_PTH( 6,16,64, CFG.req_magic, "The path to the ^magic filerequest^ files.", 0750) case 2: E_STR( 7,16,64, CFG.dospath, "The translated ^DOS^ drive and path, empty disables translation") - case 3: E_PTH( 8,16,64, CFG.uxpath, "The translated ^Unix^ path.") + case 3: E_PTH( 8,16,64, CFG.uxpath, "The translated ^Unix^ path.", 0750) case 4: E_BOOL(9,16, CFG.leavecase, "^Leave^ outbound flo filenames as is, ^No^ forces uppercase.") - case 5: E_PTH(10,16,64, CFG.ftp_base, "The ^FTP home^ directory to strip of the real directory") - case 6: E_PTH(11,16,64, CFG.alists_path, "The path where ^area lists^ and ^filebone lists^ are stored.") + case 5: E_PTH(10,16,64, CFG.ftp_base, "The ^FTP home^ directory to strip of the real directory", 0750) + case 6: E_PTH(11,16,64, CFG.alists_path, "The path where ^area lists^ and ^filebone lists^ are stored.", 0750) case 7: E_STR(12,16,64, CFG.externaleditor, "The full path and filename to the ^external message editor^ (blank=disable)") } @@ -296,17 +296,17 @@ void e_global(void) switch(select_menu(12)) { case 0: return; - case 1: E_PTH( 6,16,64, CFG.bbs_menus, "The path to the ^default menus^.") - case 2: E_PTH( 7,16,64, CFG.bbs_txtfiles, "The path to the ^default textfiles^.") - case 3: E_PTH( 8,16,64, CFG.bbs_macros, "The path to the ^default macro templates^.") - case 4: E_PTH( 9,16,64, CFG.bbs_usersdir, "The path to the ^users home^ directories.") - case 5: E_PTH(10,16,64, CFG.nodelists, "The path to the ^nodelists^.") - case 6: E_PTH(11,16,64, CFG.inbound, "The path to the ^inbound^ for unknown systems.") - case 7: E_PTH(12,16,64, CFG.pinbound, "The path to the ^nodelists^ for protected systems.") - case 8: E_PTH(13,16,64, CFG.outbound, "The path to the base ^outbound^ directory.") - case 9: E_PTH(14,16,64, CFG.msgs_path, "The path to the ^*.msgs^ directory.") - case 10:E_PTH(15,16,64, CFG.badtic, "The path to the ^bad tic files^.") - case 11:E_PTH(16,16,64, CFG.ticout, "The path to the ^outgoing TIC^ files.") + case 1: E_PTH( 6,16,64, CFG.bbs_menus, "The path to the ^default menus^.", 0750) + case 2: E_PTH( 7,16,64, CFG.bbs_txtfiles, "The path to the ^default textfiles^.", 0750) + case 3: E_PTH( 8,16,64, CFG.bbs_macros, "The path to the ^default macro templates^.", 0750) + case 4: E_PTH( 9,16,64, CFG.bbs_usersdir, "The path to the ^users home^ directories.", 0770) + case 5: E_PTH(10,16,64, CFG.nodelists, "The path to the ^nodelists^.", 0750) + case 6: E_PTH(11,16,64, CFG.inbound, "The path to the ^inbound^ for unknown systems.", 0750) + case 7: E_PTH(12,16,64, CFG.pinbound, "The path to the ^nodelists^ for protected systems.", 0750) + case 8: E_PTH(13,16,64, CFG.outbound, "The path to the base ^outbound^ directory.", 0750) + case 9: E_PTH(14,16,64, CFG.msgs_path, "The path to the ^*.msgs^ directory.", 0750) + case 10:E_PTH(15,16,64, CFG.badtic, "The path to the ^bad tic files^.", 0750) + case 11:E_PTH(16,16,64, CFG.ticout, "The path to the ^outgoing TIC^ files.", 0750) case 12:e_global2(); s_global(); break; @@ -1066,9 +1066,9 @@ void e_intmailcfg(void) case 1: E_STR( 7,16,64, CFG.popnode, "The ^FQDN^ of the node where the ^POP3^ server runs.") case 2: E_STR( 8,16,64, CFG.smtpnode, "The ^FQDN^ of the node where the ^SMTP^ server runs.") case 3: if (CFG.newsfeed == FEEDRNEWS) - strcpy(CFG.rnewspath, edit_pth(9,16,64, CFG.rnewspath, (char *)"The path and filename to the ^rnews^ command.")); + strcpy(CFG.rnewspath, edit_pth(9,16,64, CFG.rnewspath, (char *)"The path and filename to the ^rnews^ command.", 0775)); if (CFG.newsfeed == FEEDUUCP) - strcpy(CFG.rnewspath, edit_pth(9,16,64, CFG.rnewspath, (char *)"The path to the ^uucppublic^ directory.")); + strcpy(CFG.rnewspath, edit_pth(9,16,64, CFG.rnewspath, (char *)"The path to the ^uucppublic^ directory.", 0775)); break; case 4: if (CFG.newsfeed == FEEDINN) strcpy(CFG.nntpnode, edit_str(10,16,64, CFG.nntpnode, (char *)"The ^FQDN^ of the node where the ^NNTP^ server runs.")); diff --git a/mbsetup/m_lang.c b/mbsetup/m_lang.c index d450f1de..4f12351f 100644 --- a/mbsetup/m_lang.c +++ b/mbsetup/m_lang.c @@ -350,9 +350,9 @@ int EditLangRec(int Area) return 0; case 1: E_UPS( 7,16,1, lang.LangKey, "The ^Key^ to select this language") case 2: E_STR( 8,16,30,lang.Name, "The ^name^ of this language") - case 3: E_PTH( 9,16,64,lang.MenuPath, "The ^Menus Path^ of this language") - case 4: E_PTH( 10,16,64,lang.TextPath, "The ^Textfile path^ of this language") - case 5: E_PTH( 11,16,64,lang.MacroPath,"The ^Macro template path^ if this language") + case 3: E_PTH( 9,16,64,lang.MenuPath, "The ^Menus Path^ of this language", 0755) + case 4: E_PTH( 10,16,64,lang.TextPath, "The ^Textfile path^ of this language", 0755) + case 5: E_PTH( 11,16,64,lang.MacroPath,"The ^Macro template path^ if this language", 0755) case 6: E_BOOL(12,16, lang.Available,"Is this language ^available^") case 7: E_STR( 13,16,24,lang.Filename, "The ^Filename^ (without path) of the language datafile") case 8: E_SEC( 14,16, lang.Security, "8.2. LANGUAGE SECURITY", s_lang) diff --git a/mbsetup/m_magic.c b/mbsetup/m_magic.c index 000aa601..1dd8236b 100644 --- a/mbsetup/m_magic.c +++ b/mbsetup/m_magic.c @@ -364,7 +364,7 @@ int EditMagicRec(int Area) case MG_COPY: case MG_UNPACK: - E_PTH(12,16,64, magic.Path, "The ^path^ to use") + E_PTH(12,16,64, magic.Path, "The ^path^ to use", 0750) case MG_EXEC: E_STR(12,16,64, magic.Cmd, "The ^command^ to execute") diff --git a/mbsetup/m_mgroup.c b/mbsetup/m_mgroup.c index 32d455d8..b5dec00f 100644 --- a/mbsetup/m_mgroup.c +++ b/mbsetup/m_mgroup.c @@ -381,7 +381,7 @@ int EditMGrpRec(int Area) } break; case 2: E_STR( 8,16,55, mgroup.Comment, "The ^desription^ for this message group") - case 3: E_PTH( 9,16,64, mgroup.BasePath, "The ^Base path^ where new JAM areas are created") + case 3: E_PTH( 9,16,64, mgroup.BasePath, "The ^Base path^ where new JAM areas are created", 0770) case 4: E_SEC( 10,16, mgroup.RDSec, "9.1.4 MESSAGE GROUP READ SECURITY", MgScreen) case 5: E_SEC( 11,16, mgroup.WRSec, "9.1.5 MESSAGE GROUP WRITE SECURITY", MgScreen) case 6: E_SEC( 12,16, mgroup.SYSec, "9.1.6 MESSAGE GROUP SYSOP SECURITY", MgScreen) diff --git a/mbsetup/m_node.c b/mbsetup/m_node.c index f454fd20..aebfc8e7 100644 --- a/mbsetup/m_node.c +++ b/mbsetup/m_node.c @@ -360,42 +360,39 @@ int CheckAka(fidoaddr A) void E_Mail(void); void E_Mail(void) { - clr_index(); + clr_index(); + set_color(WHITE, BLACK); + mvprintw( 5, 6, "7.4 EDIT NODE - MAIL PROCESSING"); + set_color(CYAN, BLACK); + mvprintw( 7, 6, "1. PKT password"); + mvprintw( 8, 6, "2. Check PKT pwd"); + mvprintw( 9, 6, "3. UplMgr program"); + mvprintw(10, 6, "4. UplMgr passwd"); + mvprintw(11, 6, "5. Mail forward"); + mvprintw(12, 6, "6. ARCmail comp."); + mvprintw(13, 6, "7. ARCmail a..z"); + + for (;;) { set_color(WHITE, BLACK); - mvprintw( 5, 6, "7.14 EDIT NODE - MAIL PROCESSING"); - set_color(CYAN, BLACK); - mvprintw( 7, 6, "1. Session pwd"); - mvprintw( 8, 6, "2. PKT password"); - mvprintw( 9, 6, "3. Check PKT pwd"); - mvprintw(10, 6, "4. UplMgr program"); - mvprintw(11, 6, "5. UplMgr passwd"); - mvprintw(12, 6, "6. Mail forward"); - mvprintw(13, 6, "7. ARCmail comp."); - mvprintw(14, 6, "8. ARCmail a..z"); + show_str( 7,25,15, (char *)"***************"); + show_bool( 8,25, nodes.MailPwdCheck); + show_str( 9,25, 8, nodes.UplAmgrPgm); + show_str( 10,25,15, (char *)"***************"); + show_bool(11,25, nodes.MailFwd); + show_bool(12,25, nodes.ARCmailCompat); + show_bool(13,25, nodes.ARCmailAlpha); - for (;;) { - set_color(WHITE, BLACK); - show_str( 7,25,15, (char *)"***************"); - show_str( 8,25,15, (char *)"***************"); - show_bool(9,25, nodes.MailPwdCheck); - show_str(10,25, 8, nodes.UplAmgrPgm); - show_str(11,25,15, (char *)"***************"); - show_bool(12,25, nodes.MailFwd); - show_bool(13,25, nodes.ARCmailCompat); - show_bool(14,25, nodes.ARCmailAlpha); - - switch(select_menu(8)) { - case 0: return; - case 1: E_STR( 7,25,15,nodes.Spasswd, "The ^Session password^ for this node") - case 2: E_STR( 8,25,15,nodes.Epasswd, "The ^Mail (.pkt)^ password^ for this node") - case 3: E_BOOL( 9,25, nodes.MailPwdCheck, "Check the ^mail PKT^ password") - case 4: E_STR( 10,25, 8,nodes.UplAmgrPgm, "Name of the uplink ^areamanager program^") - case 5: E_STR( 11,25,15,nodes.UplAmgrPass, "Uplink ^areamanager password^ for this node") - case 6: E_BOOL(12,25, nodes.MailFwd, "^Forward^ echomail for this node") - case 7: E_BOOL(13,25, nodes.ARCmailCompat, "Use ^ARCmail 0.60^ file naming convention for out of zone mail") - case 8: E_BOOL(14,25, nodes.ARCmailAlpha, "Allow ^0..9 and a..z^ filename extensions for ARCmail archives") - } + switch(select_menu(7)) { + case 0: return; + case 1: E_STR( 7,25,15, nodes.Epasswd, "The ^Mail (.pkt)^ password^ for this node") + case 2: E_BOOL( 8,25, nodes.MailPwdCheck, "Check the ^mail PKT^ password") + case 3: E_STR( 9,25, 8, nodes.UplAmgrPgm, "Name of the uplink ^areamanager program^") + case 4: E_STR( 10,25,15, nodes.UplAmgrPass, "Uplink ^areamanager password^ for this node") + case 5: E_BOOL(11,25, nodes.MailFwd, "^Forward^ echomail for this node") + case 6: E_BOOL(12,25, nodes.ARCmailCompat, "Use ^ARCmail 0.60^ file naming convention for out of zone mail") + case 7: E_BOOL(13,25, nodes.ARCmailAlpha, "Allow ^0..9 and a..z^ filename extensions for ARCmail archives") } + } } @@ -403,66 +400,66 @@ void E_Mail(void) void E_Files(void); void E_Files(void) { - clr_index(); + clr_index(); + set_color(WHITE, BLACK); + mvprintw( 5, 6, "7.6 EDIT NODE - FILES PROCESSING"); + set_color(CYAN, BLACK); + mvprintw( 7, 6, "1. Files password"); + mvprintw( 8, 6, "2. Mgr password"); + mvprintw( 9, 6, "3. UplMgr program"); + mvprintw(10, 6, "4. UplMgr passwd"); + mvprintw(11, 6, "5. UplMgr Add +"); + mvprintw(12, 6, "6. Incl. message"); + mvprintw(13, 6, "7. Send TIC file"); + mvprintw(14, 6, "8. Advanced TIC"); + mvprintw(15, 6, "9. File forward"); + mvprintw(16, 6, "10. Billing (CSO)"); + mvprintw( 7,46, "11. Bill direct"); + mvprintw( 8,46, "12. Credit"); + mvprintw( 9,46, "13. Debet"); + mvprintw(10,46, "14. Add %"); + mvprintw(11,46, "15. Warn level"); + mvprintw(12,46, "16. Stop level"); + + for (;;) { set_color(WHITE, BLACK); - mvprintw( 5, 6, "7.16 EDIT NODE - FILES PROCESSING"); - set_color(CYAN, BLACK); - mvprintw( 7, 6, "1. Files password"); - mvprintw( 8, 6, "2. Mgr password"); - mvprintw( 9, 6, "3. UplMgr program"); - mvprintw(10, 6, "4. UplMgr passwd"); - mvprintw(11, 6, "5. UplMgr Add +"); - mvprintw(12, 6, "6. Incl. message"); - mvprintw(13, 6, "7. Send TIC file"); - mvprintw(14, 6, "8. Advanced TIC"); - mvprintw(15, 6, "9. File forward"); - mvprintw(16, 6, "10. Billing (CSO)"); - mvprintw( 7,46, "11. Bill direct"); - mvprintw( 8,46, "12. Credit"); - mvprintw( 9,46, "13. Debet"); - mvprintw(10,46, "14. Add %"); - mvprintw(11,46, "15. Warn level"); - mvprintw(12,46, "16. Stop level"); + show_str( 7,26,15, (char *)"***************"); + show_str( 8,26,15, (char *)"***************"); + show_str( 9,26, 8, nodes.UplFmgrPgm); + show_str( 10,26,15, (char *)"***************"); + show_bool(11,26, nodes.AddPlus); + show_bool(12,26, nodes.Message); + show_bool(13,26, nodes.Tic); + show_bool(14,26, nodes.AdvTic); + show_bool(15,26, nodes.FileFwd); + show_bool(16,26, nodes.Billing); + show_bool( 7,65, nodes.BillDirect); + show_int( 8,65, nodes.Credit); + show_int( 9,65, nodes.Debet); + show_int( 10,65, nodes.AddPerc); + show_int( 11,65, nodes.WarnLevel); + show_int( 12,65, nodes.StopLevel); - for (;;) { - set_color(WHITE, BLACK); - show_str( 7,25,15, (char *)"***************"); - show_str( 8,25,15, (char *)"***************"); - show_str( 9,25, 8, nodes.UplFmgrPgm); - show_str(10,25,15, (char *)"***************"); - show_bool(11,25, nodes.AddPlus); - show_bool(12,25, nodes.Message); - show_bool(13,25, nodes.Tic); - show_bool(14,25, nodes.AdvTic); - show_bool(15,25, nodes.FileFwd); - show_bool(16,25, nodes.Billing); - show_bool( 7,65, nodes.BillDirect); - show_int( 8,65, nodes.Credit); - show_int( 9,65, nodes.Debet); - show_int(10,65, nodes.AddPerc); - show_int(11,65, nodes.WarnLevel); - show_int(12,65, nodes.StopLevel); - - switch(select_menu(16)) { - case 0: return; - case 1: E_STR( 7,25,15,nodes.Fpasswd, "The ^TIC^ files ^password^ for this node") - case 2: E_STR( 8,25,15,nodes.Apasswd, "The filemanager ^password^ for this node") - case 3: E_STR( 9,25,8, nodes.UplFmgrPgm, "The name of the uplink ^filemanager^ program") - case 4: E_STR( 10,25,15,nodes.UplFmgrPass,"The uplink filemanager ^password^") - case 5: E_BOOL(11,25, nodes.AddPlus, "Add ^+^ in uplink manager requests for new areas") - case 6: E_BOOL(12,25, nodes.Message, "Send ^messages^ with files send to this node") - case 7: E_BOOL(13,25, nodes.Tic, "Send ^TIC^ files to this node") - case 8: E_BOOL(14,25, nodes.AdvTic, "Send ^advanced^ TIC files to this node") - case 9: E_BOOL(15,25, nodes.FileFwd, "^Forward TIC^ files for this node") - case 10:E_BOOL(16,25, nodes.Billing, "Send ^bills^ to this node, Costsharing is active") - case 11:E_BOOL( 7,65, nodes.BillDirect, "Send bills ^direct^ after file processing") - case 12:E_INT( 8,65, nodes.Credit, "The ^credit^ this node has for costsharing") - case 13:E_INT( 9,65, nodes.Debet, "The ^debet^ in cents we have credit from this node") - case 14:E_INT( 10,65, nodes.AddPerc, "The + or - ^promille^ factor for this node") - case 15:E_INT( 11,65, nodes.WarnLevel, "Credit level in cents to ^Warn^ node for low credit") - case 16:E_INT( 12,65, nodes.StopLevel, "Credit level in cents to ^Stop^ sending files") - } + switch(select_menu(16)) { + case 0: return; + case 1: E_STR( 7,26,15,nodes.Fpasswd, "The ^TIC^ files ^password^ for this node") + case 2: E_STR( 8,26,15,nodes.Apasswd, "The filemanager ^password^ for this node") + case 3: E_STR( 9,26,8, nodes.UplFmgrPgm, "The name of the uplink ^filemanager^ program") + case 4: E_STR( 10,26,15,nodes.UplFmgrPass,"The uplink filemanager ^password^") + case 5: E_BOOL(11,26, nodes.AddPlus, "Add ^+^ in uplink manager requests for new areas") + case 6: E_BOOL(12,26, nodes.Message, "Send ^messages^ with files send to this node") + case 7: E_BOOL(13,26, nodes.Tic, "Send ^TIC^ files to this node") + case 8: E_BOOL(14,26, nodes.AdvTic, "Send ^advanced^ TIC files to this node") + case 9: E_BOOL(15,26, nodes.FileFwd, "^Forward TIC^ files for this node") + case 10:E_BOOL(16,26, nodes.Billing, "Send ^bills^ to this node, Costsharing is active") + case 11:E_BOOL( 7,65, nodes.BillDirect, "Send bills ^direct^ after file processing") + case 12:E_INT( 8,65, nodes.Credit, "The ^credit^ this node has for costsharing") + case 13:E_INT( 9,65, nodes.Debet, "The ^debet^ in cents we have credit from this node") + case 14:E_INT( 10,65, nodes.AddPerc, "The + or - ^promille^ factor for this node") + case 15:E_INT( 11,65, nodes.WarnLevel, "Credit level in cents to ^Warn^ node for low credit") + case 16:E_INT( 12,65, nodes.StopLevel, "Credit level in cents to ^Stop^ sending files") } + } } @@ -476,7 +473,7 @@ void S_Stat(void) clr_index(); set_color(WHITE, BLACK); - mvprintw( 5, 7, "7.18 NODE STATISTICS"); + mvprintw( 5, 6, "7.8 NODE STATISTICS"); set_color(CYAN, BLACK); mvprintw( 8,18, " This week Last week This month Last month Total"); mvprintw( 9,18, "---------- ---------- ---------- ---------- ----------"); @@ -498,12 +495,18 @@ void S_Stat(void) else LMiy = Miy - 1; - mvprintw(10,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.FilesSent.tweek, nodes.FilesSent.lweek, nodes.FilesSent.month[Miy], nodes.FilesSent.month[LMiy], nodes.FilesSent.total); - mvprintw(11,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.F_KbSent.tweek, nodes.F_KbSent.lweek, nodes.F_KbSent.month[Miy], nodes.F_KbSent.month[LMiy], nodes.F_KbSent.total); - mvprintw(12,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.FilesRcvd.tweek, nodes.FilesRcvd.lweek, nodes.FilesRcvd.month[Miy], nodes.FilesRcvd.month[LMiy], nodes.FilesRcvd.total); - mvprintw(13,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.F_KbRcvd.tweek, nodes.F_KbRcvd.lweek, nodes.F_KbRcvd.month[Miy], nodes.F_KbRcvd.month[LMiy], nodes.F_KbRcvd.total); - mvprintw(14,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.MailSent.tweek, nodes.MailSent.lweek, nodes.MailSent.month[Miy], nodes.MailSent.month[LMiy], nodes.MailSent.total); - mvprintw(15,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.MailRcvd.tweek, nodes.MailRcvd.lweek, nodes.MailRcvd.month[Miy], nodes.MailRcvd.month[LMiy], nodes.MailRcvd.total); + mvprintw(10,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.FilesSent.tweek, + nodes.FilesSent.lweek, nodes.FilesSent.month[Miy], nodes.FilesSent.month[LMiy], nodes.FilesSent.total); + mvprintw(11,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.F_KbSent.tweek, + nodes.F_KbSent.lweek, nodes.F_KbSent.month[Miy], nodes.F_KbSent.month[LMiy], nodes.F_KbSent.total); + mvprintw(12,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.FilesRcvd.tweek, + nodes.FilesRcvd.lweek, nodes.FilesRcvd.month[Miy], nodes.FilesRcvd.month[LMiy], nodes.FilesRcvd.total); + mvprintw(13,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.F_KbRcvd.tweek, + nodes.F_KbRcvd.lweek, nodes.F_KbRcvd.month[Miy], nodes.F_KbRcvd.month[LMiy], nodes.F_KbRcvd.total); + mvprintw(14,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.MailSent.tweek, + nodes.MailSent.lweek, nodes.MailSent.month[Miy], nodes.MailSent.month[LMiy], nodes.MailSent.total); + mvprintw(15,18, (char *)"%10lu %10lu %10lu %10lu %10lu", nodes.MailRcvd.tweek, + nodes.MailRcvd.lweek, nodes.MailRcvd.month[Miy], nodes.MailRcvd.month[LMiy], nodes.MailRcvd.total); set_color(CYAN, BLACK); center_addstr(LINES - 4, (char *)"Press any key"); readkey(LINES - 4, COLS / 2 + 8, LIGHTGRAY, BLACK); @@ -615,44 +618,208 @@ void N_Akas(void) -void NScreen(void); -void NScreen(void) +void GeneralScreen(void); +void GeneralScreen(void) { - clr_index(); + clr_index(); + set_color(WHITE, BLACK); + mvprintw( 5, 2, "7.1 EDIT NODE GENERAL"); + set_color(CYAN, BLACK); + mvprintw( 7, 2, "1. Sysop name"); + mvprintw( 8, 2, "2. Outbox dir"); + mvprintw( 9, 2, "3. Pvt. phone"); + mvprintw(10, 2, "4. Pvt. fax"); + mvprintw(11, 2, "5. Pvt. Cellphone"); + mvprintw(12, 2, "6. Pvt. e-mail"); + mvprintw(13, 2, "7. Pvt. remark"); + mvprintw(14, 2, "8. Route via"); + mvprintw(15, 2, "9. Netmail direct"); + mvprintw(16, 2, "10. Netmail crash"); + mvprintw(17, 2, "11. Netmail hold"); + mvprintw(18, 2, "12. Pack netmail"); + + mvprintw(16,42, "13. Send notify"); + mvprintw(17,42, "14. Language"); + mvprintw(18,42, "15. Deleted"); +} + + + +void GeneralEdit(void); +void GeneralEdit(void) +{ + int i, count; + char temp1[32]; + + GeneralScreen(); + for (;;) { set_color(WHITE, BLACK); - mvprintw( 5, 2, "7. EDIT NODE"); - set_color(CYAN, BLACK); - mvprintw( 7, 2, "1. Sysop name"); - mvprintw( 8, 2, "2. Fido aka's"); - mvprintw( 9, 2, "3. Dial command"); - mvprintw(10, 2, "4. Phone number 1"); - mvprintw(11, 2, "5. Phone number 2"); - mvprintw(12, 2, "6. Route via"); - mvprintw(13, 2, "7. Netmail direct"); - mvprintw(14, 2, "8. Netmail crash"); - mvprintw(15, 2, "9. Netmail hold"); - mvprintw(16, 2, "10. Pack netmail"); - mvprintw(17, 2, "11. Send notify"); - mvprintw(18, 2, "12. Language"); - mvprintw(19, 2, "13. Deleted"); + show_str( 7,23,35, nodes.Sysop); + show_str( 8,23,55, nodes.OutBox); + show_str( 9,23,16, nodes.Ct_phone); + show_str(10,23,16, nodes.Ct_fax); + show_str(11,23,20, nodes.Ct_cellphone); + show_str(12,23,30, nodes.Ct_email); + show_str(13,23,55, nodes.Ct_remark); + if (nodes.RouteVia.zone) + show_aka(14,23,nodes.RouteVia); + show_bool(15,23, nodes.Direct); + show_bool(16,23, nodes.Crash); + show_bool(17,23, nodes.Hold); + show_bool(18,23, nodes.PackNetmail); - mvprintw(14,31, "14. Mail setup"); - mvprintw(15,31, "15. Mail groups"); - mvprintw(16,31, "16. File setup"); - mvprintw(17,31, "17. File groups"); - mvprintw(18,31, "18. Statistics"); - mvprintw(19,31, "19. No EMSI"); + show_bool(16,63, nodes.Notify); + sprintf(temp1, "%c", nodes.Language); + show_str(17,63,1, temp1); + show_bool(18,63, nodes.Deleted); - mvprintw(10,51, "20. No YooHoo/2U2"); - mvprintw(11,51, "21. No Filerequest"); - mvprintw(12,51, "22. Don't call"); - mvprintw(13,51, "23. No Zmodem"); - mvprintw(14,51, "24. No Zedzap"); - mvprintw(15,51, "25. No Hydra"); - mvprintw(16,51, "26. No TCP/IP IBN"); - mvprintw(17,51, "27. No TCP/IP IFC"); - mvprintw(18,51, "28. No TCP/IP ITN"); - mvprintw(19,51, "29. 8.3 names"); + switch(select_menu(15)) { + case 0: return; + case 1: E_STR( 7,23,35, nodes.Sysop, "The name of the ^sysop^ for this node") + case 2: if (strlen(nodes.OutBox) == 0) { + if (nodes.Aka[0].zone) { + sprintf(nodes.OutBox, "%s/var/boxes/node%d_%d_%d", getenv("MBSE_ROOT"), + nodes.Aka[0].zone, nodes.Aka[0].net, nodes.Aka[0].node); + } else { + sprintf(nodes.OutBox, "%s/var/boxes/%s", getenv("MBSE_ROOT"), nodes.Sysop); + for (i = (strlen(nodes.OutBox) - strlen(nodes.Sysop)); i < strlen(nodes.OutBox); i++) { + nodes.OutBox[i] = tolower(nodes.OutBox[i]); + if (nodes.OutBox[i] == ' ') + nodes.OutBox[i] = '_'; + } + } + } + E_PTH( 8,23,55, nodes.OutBox, "Private extra ^outbound directory^ for this node", 0770) + case 3: E_STR( 9,23,16, nodes.Ct_phone, "Contact info: ^private phone number^") + case 4: E_STR(10,23,16, nodes.Ct_fax, "Contact info: ^private fax number^") + case 5: E_STR(11,23,20, nodes.Ct_cellphone, "Contact info: ^private cellphone/GSM^") + case 6: E_STR(12,23,30, nodes.Ct_email, "Contact info: ^private e-mail address^") + case 7: E_STR(13,23,55, nodes.Ct_remark, "Contact info: ^private remark^") + case 8: nodes.RouteVia = e_a(nodes.RouteVia, 6); GeneralScreen(); break; + case 9: E_BOOL(15,23, nodes.Direct, "Set the ^direct^ flag on netmail") + case 10:nodes.Crash = edit_bool(16,23, nodes.Crash, (char *)"Set the ^crash^ flags for this node"); + if (nodes.Crash) + nodes.Hold = FALSE; + break; + case 11:nodes.Hold = edit_bool(17,23, nodes.Hold, (char *)"Set the ^hold^ flag for this node"); + if (nodes.Hold) + nodes.Crash = FALSE; + break; + case 12:E_BOOL(18,23, nodes.PackNetmail, "^Pack netmail^ for this node") + case 13:E_BOOL(16,63, nodes.Notify, "Send ^notify^ messages to this node") + case 14:i = PickLanguage((char *)"7.1.14"); + if (i != '\0') + nodes.Language = i; + GeneralScreen(); + break; + case 15:count = 0; + working(1, 0, 0); + for (i = 0; i < 20; i++) + if (nodes.Aka[i].zone) + count += NodeInMarea(nodes.Aka[i]); + if (count) { + working(0, 0, 0); + errmsg((char *)"Node is connected to %d message areas", count); + break; + } + count = 0; + for (i = 0; i < 20; i++) + if (nodes.Aka[i].zone) + count += NodeInTic(nodes.Aka[i]); + working(0, 0, 0); + if (count) { + errmsg((char *)"Node is connected to %d tic areas", count); + break; + } + E_BOOL(18,63, nodes.Deleted, "Is this node ^Deleted^") + } + } +} + + + +void SessionScreen(void); +void SessionScreen(void) +{ + clr_index(); + set_color(WHITE, BLACK); + mvprintw( 5, 6, "7.3 EDIT NODE SESSION"); + set_color(CYAN, BLACK); + + mvprintw( 7, 6, "1. Session passwd"); + mvprintw( 8, 6, "2. Dial command"); + mvprintw( 9, 6, "3. Phone number 1"); + mvprintw(10, 6, "4. Phone number 2"); +// mvprintw(11, 6, "5. Nodelist flags"); +// mvprintw(12, 6, "6. Inet hostname"); +// mvprintw(13, 6, "7. Outbound sess."); +// mvprintw(14, 6, "8. Inbound sess."); + mvprintw(15, 6, "9. No EMSI"); + mvprintw(16, 6, "10. No YooHoo/2U2"); + mvprintw(17, 6, "11. No Filerequest"); + mvprintw(18, 6, "12. Don't call"); + mvprintw(19, 6, "13. 8.3 names"); + + mvprintw(14,41, "14. No Zmodem"); + mvprintw(15,41, "15. No Zedzap"); + mvprintw(16,41, "16. No Hydra"); + mvprintw(17,41, "17. No TCP/IP IBN"); + mvprintw(18,41, "18. No TCP/IP IFC"); + mvprintw(19,41, "19. No TCP/IP ITN"); +} + + + +void SessionEdit(void); +void SessionEdit(void) +{ + SessionScreen(); + + for (;;) { + set_color(WHITE, BLACK); + show_str( 7,26,15, (char *)"***************"); + show_str( 8,26,40, nodes.dial); + show_str( 9,26,20, nodes.phone[0]); + show_str( 10,26,20, nodes.phone[1]); + show_str( 11,26,54, nodes.Nl_flags); + show_str( 12,26,40, nodes.Nl_hostname); + + show_bool(15,26, nodes.NoEMSI); + show_bool(16,26, nodes.NoWaZOO); + show_bool(17,26, nodes.NoFreqs); + show_bool(18,26, nodes.NoCall); + show_bool(19,26, nodes.FNC); + + show_bool(14,61, nodes.NoZmodem); + show_bool(15,61, nodes.NoZedzap); + show_bool(16,61, nodes.NoHydra); + show_bool(17,61, nodes.NoIBN); + show_bool(18,61, nodes.NoIFC); + show_bool(19,61, nodes.NoITN); + + switch(select_menu(19)) { + case 0: return; + case 1: E_STR( 7,26,15, nodes.Spasswd, "The ^Session password^ for this node") + case 2: E_STR( 8,26,40, nodes.dial, "If needed, give a special modem ^dial command^ for this node") + case 3: E_STR( 9,26,20, nodes.phone[0], "Enter ^phone number^ to override the nodelist") + case 4: E_STR( 10,26,20, nodes.phone[1], "Enter ^phone number^ to override the nodelist") +// case 5: E_STR( 11,26,54, nodes.Nl_flags, "^Nodelist flags^ override") +// case 6: E_STR( 12,26,40, nodes.Nl_hostname, "Node internet ^hostname/IP address^ override") + + case 9: E_BOOL(15,26, nodes.NoEMSI, "Disable ^EMSI handshake^ with this node") + case 10:E_BOOL(16,26, nodes.NoWaZOO, "Disable ^YooHoo/2U2 handshake^ (FTSC-0006) with this node") + case 11:E_BOOL(17,26, nodes.NoFreqs, "Disallow ^file requests^ from this node") + case 12:E_BOOL(18,26, nodes.NoCall, "Don't ^call^ this node") + case 13:E_BOOL(19,26, nodes.FNC, "Node needs ^DOS 8.3^ filenames") + + case 14:E_BOOL(14,61, nodes.NoZmodem, "Disable ^Zmodem^ protocol with this node") + case 15:E_BOOL(15,61, nodes.NoZedzap, "Disable ^Zedzap^ protocol with this node") + case 16:E_BOOL(16,61, nodes.NoHydra, "Disable ^Hydra^ protocol with this node") + case 17:E_BOOL(17,61, nodes.NoIBN, "Disable ^TCP/IP IBN binkp^ protocol with this node") + case 18:E_BOOL(18,61, nodes.NoIFC, "Disable ^TCP/IP IFC ifcico^ protocol with this node") + case 19:E_BOOL(19,61, nodes.NoITN, "Disable ^TCP/IP ITN telnet^ protocol with this node") + } + } } @@ -663,239 +830,170 @@ void NScreen(void) int EditNodeRec(int); int EditNodeRec(int Area) { - FILE *fil; - char mfile[PATH_MAX]; - long offset; - unsigned long crc, crc1; - gr_list *fgr = NULL, *egr = NULL, *tmp; - char group[13]; - int count, groups, i, j, GrpChanged = FALSE; - char *temp, temp1[32]; + FILE *fil; + char mfile[PATH_MAX]; + long offset; + unsigned long crc, crc1; + gr_list *fgr = NULL, *egr = NULL, *tmp; + char group[13]; + int groups, i, j, GrpChanged = FALSE; - clr_index(); - working(1, 0, 0); - IsDoing("Edit Fido Node"); + clr_index(); + working(1, 0, 0); + IsDoing("Edit Fido Node"); - sprintf(mfile, "%s/etc/mgroups.data", getenv("MBSE_ROOT")); - if ((fil = fopen(mfile, "r")) != NULL) { - fread(&mgrouphdr, sizeof(mgrouphdr), 1, fil); + sprintf(mfile, "%s/etc/mgroups.data", getenv("MBSE_ROOT")); + if ((fil = fopen(mfile, "r")) != NULL) { + fread(&mgrouphdr, sizeof(mgrouphdr), 1, fil); - while (fread(&mgroup, mgrouphdr.recsize, 1, fil) == 1) - fill_grlist(&egr, mgroup.Name); - - fclose(fil); - sort_grlist(&egr); - } - - sprintf(mfile, "%s/etc/fgroups.data", getenv("MBSE_ROOT")); - if ((fil = fopen(mfile, "r")) != NULL) { - fread(&fgrouphdr, sizeof(fgrouphdr), 1, fil); - - while (fread(&fgroup, fgrouphdr.recsize, 1, fil) == 1) - fill_grlist(&fgr, fgroup.Name); - - fclose(fil); - sort_grlist(&fgr); - } - - sprintf(mfile, "%s/etc/nodes.temp", getenv("MBSE_ROOT")); - if ((fil = fopen(mfile, "r")) == NULL) { - working(2, 0, 0); - tidy_grlist(&egr); - tidy_grlist(&fgr); - return -1; - } - - fread(&nodeshdr, sizeof(nodeshdr), 1, fil); - offset = nodeshdr.hdrsize + ((Area -1) * (nodeshdr.recsize + nodeshdr.filegrp + nodeshdr.mailgrp)); - if (fseek(fil, offset, 0) != 0) { - working(2, 0, 0); - tidy_grlist(&egr); - tidy_grlist(&fgr); - return -1; - } - - fread(&nodes, nodeshdr.recsize, 1, fil); - groups = nodeshdr.filegrp / 13; - - for (i = 0; i < groups; i++) { - fread(&group, sizeof(group), 1, fil); - if (strlen(group)) { - for (tmp = fgr; tmp; tmp = tmp->next) - if (!strcmp(tmp->group, group)) - tmp->tagged = TRUE; - } - } - - groups = nodeshdr.mailgrp / 13; - - for (i = 0; i < groups; i++) { - fread(&group, sizeof(group), 1, fil); - if (strlen(group)) { - for (tmp = egr; tmp; tmp = tmp->next) - if (!strcmp(tmp->group, group)) - tmp->tagged = TRUE; - } - } + while (fread(&mgroup, mgrouphdr.recsize, 1, fil) == 1) + fill_grlist(&egr, mgroup.Name); fclose(fil); - crc = 0xffffffff; - crc = upd_crc32((char *)&nodes, crc, nodeshdr.recsize); - working(0, 0, 0); - NScreen(); - - for (;;) { - set_color(WHITE, BLACK); - show_str( 7,21,35, nodes.Sysop); - temp = xstrcpy((char *)""); - for (i = 0; i < 7; i++) { - if (nodes.Aka[i].zone) { - if (nodes.Aka[i].point) - sprintf(temp1, "%d:%d/%d.%d ", nodes.Aka[i].zone, nodes.Aka[i].net, nodes.Aka[i].node, nodes.Aka[i].point); - else - sprintf(temp1, "%d:%d/%d ", nodes.Aka[i].zone, nodes.Aka[i].net, nodes.Aka[i].node); - temp = xstrcat(temp, temp1); - } - } - show_str( 8,21,58, temp); - free(temp); - show_str( 9,21,40, nodes.dial); - show_str(10,21,20, nodes.phone[0]); - show_str(11,21,20, nodes.phone[1]); - if (nodes.RouteVia.zone) - show_aka(12,21,nodes.RouteVia); - show_bool(13,21, nodes.Direct); - show_bool(14,21, nodes.Crash); - show_bool(15,21, nodes.Hold); - show_bool(16,21, nodes.PackNetmail); - show_bool(17,21, nodes.Notify); - sprintf(temp1, "%c", nodes.Language); - show_str(18,21,1, temp1); - show_bool(19,21, nodes.Deleted); - show_bool(19,47, nodes.NoEMSI); - show_bool(10,70, nodes.NoWaZOO); - show_bool(11,70, nodes.NoFreqs); - show_bool(12,70, nodes.NoCall); - show_bool(13,70, nodes.NoZmodem); - show_bool(14,70, nodes.NoZedzap); - show_bool(15,70, nodes.NoHydra); - show_bool(16,70, nodes.NoIBN); - show_bool(17,70, nodes.NoIFC); - show_bool(18,70, nodes.NoITN); - show_bool(19,70, nodes.FNC); + sort_grlist(&egr); + } - switch(select_menu(29)) { - case 0: crc1 = 0xffffffff; - crc1 = upd_crc32((char *)&nodes, crc1, nodeshdr.recsize); - if ((crc != crc1) || GrpChanged) { - if (yes_no((char *)"Record is changed, save") == 1) { - working(1, 0, 0); - Syslog('+', "Updated node record %s", nodes.Sysop); - if ((fil = fopen(mfile, "r+")) == NULL) { - working(2, 0, 0); - return -1; - } - fseek(fil, offset, 0); - fwrite(&nodes, nodeshdr.recsize, 1, fil); + sprintf(mfile, "%s/etc/fgroups.data", getenv("MBSE_ROOT")); + if ((fil = fopen(mfile, "r")) != NULL) { + fread(&fgrouphdr, sizeof(fgrouphdr), 1, fil); - groups = nodeshdr.filegrp / 13; - i = 0; - for (tmp = fgr; tmp; tmp = tmp->next) - if (tmp->tagged) { - i++; - memset(&group, 0, 13); - sprintf(group, "%s", tmp->group); - fwrite(&group, 13, 1, fil); - } + while (fread(&fgroup, fgrouphdr.recsize, 1, fil) == 1) + fill_grlist(&fgr, fgroup.Name); - memset(&group, 0, sizeof(group)); - for (j = i; j < groups; j++) - fwrite(&group, 13, 1, fil); + fclose(fil); + sort_grlist(&fgr); + } - groups = nodeshdr.mailgrp / 13; - i = 0; - for (tmp = egr; tmp; tmp = tmp->next) - if (tmp->tagged) { - i++; - memset(&group, 0, 13); - sprintf(group, "%s", tmp->group); - fwrite(&group, 13, 1, fil); - } + sprintf(mfile, "%s/etc/nodes.temp", getenv("MBSE_ROOT")); + if ((fil = fopen(mfile, "r")) == NULL) { + working(2, 0, 0); + tidy_grlist(&egr); + tidy_grlist(&fgr); + return -1; + } - memset(&group, 0, sizeof(group)); - for (j = i; j < groups; j++) - fwrite(&group, 13, 1, fil); + fread(&nodeshdr, sizeof(nodeshdr), 1, fil); + offset = nodeshdr.hdrsize + ((Area -1) * (nodeshdr.recsize + nodeshdr.filegrp + nodeshdr.mailgrp)); + if (fseek(fil, offset, 0) != 0) { + working(2, 0, 0); + tidy_grlist(&egr); + tidy_grlist(&fgr); + return -1; + } - fclose(fil); - NodeUpdated = 1; - working(0, 0, 0); - } - } - tidy_grlist(&egr); - tidy_grlist(&fgr); - IsDoing("Browsing Menu"); - return 0; - case 1: E_STR(7,21,35, nodes.Sysop, "The name of the ^sysop^ for this node") - case 2: N_Akas(); NScreen(); break; - case 3: E_STR( 9,21,40, nodes.dial, "If needed, give a special modem ^dial command^ for this node") - case 4: E_STR(10,21,20, nodes.phone[0], "Enter ^phone number^ to override the nodelist") - case 5: E_STR(11,21,20, nodes.phone[1], "Enter ^phone number^ to override the nodelist") - case 6: nodes.RouteVia = e_a(nodes.RouteVia, 6); NScreen(); break; - case 7: E_BOOL(13,21, nodes.Direct, "Set the ^direct^ flag on netmail") - case 8: nodes.Crash = edit_bool(14,21, nodes.Crash, (char *)"Set the ^crash^ flags for this node"); - if (nodes.Crash) - nodes.Hold = FALSE; - break; - case 9: nodes.Hold = edit_bool(15,21, nodes.Hold, (char *)"Set the ^hold^ flag for this node"); - if (nodes.Hold) - nodes.Crash = FALSE; - break; - case 10:E_BOOL(16,21, nodes.PackNetmail, "^Pack netmail^ for this node") - case 11:E_BOOL(17,21, nodes.Notify, "Send ^notify^ messages to this node") - case 12:nodes.Language = PickLanguage((char *)"7.12"); NScreen(); break; - case 13:count = 0; - working(1, 0, 0); - for (i = 0; i < 20; i++) - if (nodes.Aka[i].zone) - count += NodeInMarea(nodes.Aka[i]); - if (count) { - working(0, 0, 0); - errmsg((char *)"Node is connected to %d message areas", count); - break; - } - count = 0; - for (i = 0; i < 20; i++) - if (nodes.Aka[i].zone) - count += NodeInTic(nodes.Aka[i]); - working(0, 0, 0); - if (count) { - errmsg((char *)"Node is connected to %d tic areas", count); - break; - } - E_BOOL(19,21, nodes.Deleted, "Is this node ^Deleted^") - case 14:E_Mail(); NScreen(); break; - case 15:if (E_Group(&egr, (char *)"7.15 MAIL GROUPS")) - GrpChanged = TRUE; - NScreen(); break; - case 16:E_Files(); - NScreen(); break; - case 17:if (E_Group(&fgr, (char *)"7.17 FILE GROUPS")) - GrpChanged = TRUE; - NScreen(); break; - case 18:S_Stat(); NScreen(); break; - case 19:E_BOOL(19,47, nodes.NoEMSI, "Disable ^EMSI handshake^ with this node") - case 20:E_BOOL(10,70, nodes.NoWaZOO, "Disable ^YooHoo/2U2 handshake^ (FTSC-0006) with this node") - case 21:E_BOOL(11,70, nodes.NoFreqs, "Disallow ^file requests^ from this node") - case 22:E_BOOL(12,70, nodes.NoCall, "Don't ^call^ this node") - case 23:E_BOOL(13,70, nodes.NoZmodem, "Disable ^Zmodem^ protocol with this node") - case 24:E_BOOL(14,70, nodes.NoZedzap, "Disable ^Zedzap^ protocol with this node") - case 25:E_BOOL(15,70, nodes.NoHydra, "Disable ^Hydra^ protocol with this node") - case 26:E_BOOL(16,70, nodes.NoIBN, "Disable ^TCP/IP IBN binkp^ protocol with this node") - case 27:E_BOOL(17,70, nodes.NoIFC, "Disable ^TCP/IP IFC ifcico^ protocol with this node") - case 28:E_BOOL(18,70, nodes.NoITN, "Disable ^TCP/IP ITN telnet^ protocol with this node") - case 29:E_BOOL(19,70, nodes.FNC, "Node needs ^DOS 8.3^ filenames") - } + fread(&nodes, nodeshdr.recsize, 1, fil); + groups = nodeshdr.filegrp / 13; + + for (i = 0; i < groups; i++) { + fread(&group, sizeof(group), 1, fil); + if (strlen(group)) { + for (tmp = fgr; tmp; tmp = tmp->next) + if (!strcmp(tmp->group, group)) + tmp->tagged = TRUE; } + } + + groups = nodeshdr.mailgrp / 13; + + for (i = 0; i < groups; i++) { + fread(&group, sizeof(group), 1, fil); + if (strlen(group)) { + for (tmp = egr; tmp; tmp = tmp->next) + if (!strcmp(tmp->group, group)) + tmp->tagged = TRUE; + } + } + + fclose(fil); + crc = 0xffffffff; + crc = upd_crc32((char *)&nodes, crc, nodeshdr.recsize); + working(0, 0, 0); + + for (;;) { + clr_index(); + set_color(WHITE, BLACK); + mvprintw( 5, 6, "7. EDIT NODE - %s, %s", nodes.Sysop, aka2str(nodes.Aka[0])); + set_color(CYAN, BLACK); + mvprintw( 7, 6, "1. General setup"); + mvprintw( 8, 6, "2. Aka's setup"); + mvprintw( 9, 6, "3. Session setup"); + mvprintw(10, 6, "4. Mail setup"); + mvprintw(11, 6, "5. Mail groups"); + mvprintw(12, 6, "6. Files setup"); + mvprintw(13, 6, "7. Files groups"); + mvprintw(14, 6, "8. Statistics"); + + switch(select_menu(8)) { + case 0: crc1 = 0xffffffff; + crc1 = upd_crc32((char *)&nodes, crc1, nodeshdr.recsize); + if ((crc != crc1) || GrpChanged) { + if (yes_no((char *)"Record is changed, save") == 1) { + working(1, 0, 0); + Syslog('+', "Updated node record %s", nodes.Sysop); + if ((fil = fopen(mfile, "r+")) == NULL) { + working(2, 0, 0); + return -1; + } + fseek(fil, offset, 0); + fwrite(&nodes, nodeshdr.recsize, 1, fil); + + groups = nodeshdr.filegrp / 13; + i = 0; + for (tmp = fgr; tmp; tmp = tmp->next) + if (tmp->tagged) { + i++; + memset(&group, 0, 13); + sprintf(group, "%s", tmp->group); + fwrite(&group, 13, 1, fil); + } + + memset(&group, 0, sizeof(group)); + for (j = i; j < groups; j++) + fwrite(&group, 13, 1, fil); + + groups = nodeshdr.mailgrp / 13; + i = 0; + for (tmp = egr; tmp; tmp = tmp->next) + if (tmp->tagged) { + i++; + memset(&group, 0, 13); + sprintf(group, "%s", tmp->group); + fwrite(&group, 13, 1, fil); + } + + memset(&group, 0, sizeof(group)); + for (j = i; j < groups; j++) + fwrite(&group, 13, 1, fil); + + fclose(fil); + NodeUpdated = 1; + working(0, 0, 0); + } + } + tidy_grlist(&egr); + tidy_grlist(&fgr); + IsDoing("Browsing Menu"); + return 0; + case 1: GeneralEdit(); + break; + case 2: N_Akas(); + break; + case 3: SessionEdit(); + break; + case 4: E_Mail(); + break; + case 5: if (E_Group(&egr, (char *)"7.5 MAIL GROUPS")) + GrpChanged = TRUE; + break; + case 6: E_Files(); + break; + case 7: if (E_Group(&fgr, (char *)"7.7 FILE GROUPS")) + GrpChanged = TRUE; + break; + case 8: S_Stat(); + break; + } + } } @@ -934,14 +1032,14 @@ void EditNodes(void) for (;;) { clr_index(); set_color(WHITE, BLACK); - mvprintw( 5, 4, "7. NODES SETUP"); + mvprintw( 5, 6, "7. NODES SETUP"); set_color(CYAN, BLACK); if (records != 0) { sprintf(temp, "%s/etc/nodes.temp", getenv("MBSE_ROOT")); working(1, 0, 0); if ((fil = fopen(temp, "r")) != NULL) { fread(&nodeshdr, sizeof(nodeshdr), 1, fil); - x = 2; + x = 4; y = 7; set_color(CYAN, BLACK); for (i = 1; i <= 20; i++) { @@ -1158,82 +1256,87 @@ int node_doc(FILE *fp, FILE *toc, int page) } else fprintf(fp, "\n\n"); - fprintf(fp, " Sysop %s\n", nodes.Sysop); - fprintf(fp, " First date %s", ctime(&nodes.StartDate)); - fprintf(fp, " Last date %s\n", ctime(&nodes.LastDate)); + fprintf(fp, " Sysop %s\n", nodes.Sysop); + fprintf(fp, " Outbox dir %s\n", nodes.OutBox); + fprintf(fp, " First date %s", ctime(&nodes.StartDate)); + fprintf(fp, " Last date %s", ctime(&nodes.LastDate)); for (i = 0; i < 20; i++) if (nodes.Aka[i].zone) - fprintf(fp, " Aka %2d %s\n", i+1, aka2str(nodes.Aka[i])); + fprintf(fp, " Aka %2d %s\n", i+1, aka2str(nodes.Aka[i])); if (nodes.RouteVia.zone) - fprintf(fp, " Route via %s\n", aka2str(nodes.RouteVia)); + fprintf(fp, " Route via %s\n", aka2str(nodes.RouteVia)); - fprintf(fp, " Language %c\n", nodes.Language); - fprintf(fp, " Files passwd %s\n", nodes.Fpasswd); - fprintf(fp, " Session pwd %s\n", nodes.Spasswd); - fprintf(fp, " PKT password %s\n", nodes.Epasswd); - fprintf(fp, " Areamgr pwd %s\n\n", nodes.Apasswd); + fprintf(fp, " Session pwd %s\n", nodes.Spasswd); + fprintf(fp, " Dial command %s\n", nodes.dial); + fprintf(fp, " Phone numbers %s %s\n", nodes.phone[0], nodes.phone[1]); + fprintf(fp, " Nodelist flags %s\n", nodes.Nl_flags); + fprintf(fp, " Hostname %s\n", nodes.Nl_hostname); + fprintf(fp, " PKT password %s\n", nodes.Epasswd); + fprintf(fp, " Files passwd %s\n", nodes.Fpasswd); + fprintf(fp, " Areamgr pwd %s\n\n", nodes.Apasswd); - fprintf(fp, " Uplink mgrs Program Password\n"); - fprintf(fp, " ------------ --------- ---------------\n"); - fprintf(fp, " Files %s %s\n", padleft(nodes.UplFmgrPgm, 9, ' '), nodes.UplFmgrPass); - fprintf(fp, " Mail %s %s\n\n", padleft(nodes.UplAmgrPgm, 9, ' '), nodes.UplAmgrPass); + fprintf(fp, " Mail direct %s", getboolean(nodes.Direct)); + fprintf(fp, " Mail crash %s", getboolean(nodes.Crash)); + fprintf(fp, " Mail hold %s\n", getboolean(nodes.Hold)); + fprintf(fp, " Pack Netmail %s", getboolean(nodes.PackNetmail)); + fprintf(fp, " Send notify %s", getboolean(nodes.Notify)); + fprintf(fp, " Language %c\n", nodes.Language); + fprintf(fp, " No EMSI %s", getboolean(nodes.NoEMSI)); + fprintf(fp, " No YooHoo/2U2 %s", getboolean(nodes.NoWaZOO)); + fprintf(fp, " No Requests %s\n", getboolean(nodes.NoFreqs)); + fprintf(fp, " Don't call %s", getboolean(nodes.NoCall)); + fprintf(fp, " 8.3 filenames %s", getboolean(nodes.FNC)); + fprintf(fp, " No Zmodem %s\n", getboolean(nodes.NoZmodem)); + fprintf(fp, " No Zedzap %s", getboolean(nodes.NoZedzap)); + fprintf(fp, " No Hydra %s", getboolean(nodes.NoHydra)); + fprintf(fp, " No TCP/IP IBN %s\n", getboolean(nodes.NoIBN)); + fprintf(fp, " No TCP/IP IFC %s", getboolean(nodes.NoIFC)); + fprintf(fp, " No TCP/IP ITN %s", getboolean(nodes.NoITN)); + fprintf(fp, " Mail forward %s\n", getboolean(nodes.MailFwd)); + fprintf(fp, " Check mailpwd %s", getboolean(nodes.MailPwdCheck)); + fprintf(fp, " ARCmail comp. %s", getboolean(nodes.ARCmailCompat)); + fprintf(fp, " ACRmail a..z %s\n", getboolean(nodes.ARCmailAlpha)); + fprintf(fp, " Send message %s", getboolean(nodes.Message)); + fprintf(fp, " Send .TIC %s", getboolean(nodes.Tic)); + fprintf(fp, " File forward %s\n", getboolean(nodes.FileFwd)); + fprintf(fp, " Advanced TIC %s", getboolean(nodes.AdvTic)); + fprintf(fp, " Billing %s", getboolean(nodes.Billing)); + fprintf(fp, " Bill direct %s\n", getboolean(nodes.BillDirect)); + fprintf(fp, " Uplink add + %s\n\n", getboolean(nodes.AddPlus)); - fprintf(fp, " Mail direct %s", getboolean(nodes.Direct)); - fprintf(fp, " Mail crash %s", getboolean(nodes.Crash)); - fprintf(fp, " Mail hold %s\n", getboolean(nodes.Hold)); - fprintf(fp, " Send message %s", getboolean(nodes.Message)); - fprintf(fp, " Send .TIC %s", getboolean(nodes.Tic)); - fprintf(fp, " Send notify %s\n", getboolean(nodes.Notify)); - fprintf(fp, " File forward %s", getboolean(nodes.FileFwd)); - fprintf(fp, " Mail forward %s", getboolean(nodes.MailFwd)); - fprintf(fp, " Advanced TIC %s\n", getboolean(nodes.AdvTic)); - fprintf(fp, " Billing %s", getboolean(nodes.Billing)); - fprintf(fp, " Bill direct %s", getboolean(nodes.BillDirect)); - fprintf(fp, " Uplink add + %s\n", getboolean(nodes.AddPlus)); - fprintf(fp, " Check mailpwd %s", getboolean(nodes.MailPwdCheck)); - fprintf(fp, " No EMSI %s", getboolean(nodes.NoEMSI)); - fprintf(fp, " No YooHoo/2U2 %s\n", getboolean(nodes.NoWaZOO)); - fprintf(fp, " No Requests %s", getboolean(nodes.NoFreqs)); - fprintf(fp, " Don't call %s", getboolean(nodes.NoCall)); - fprintf(fp, " No Zmodem %s\n", getboolean(nodes.NoZmodem)); - fprintf(fp, " No Zedzap %s", getboolean(nodes.NoZedzap)); - fprintf(fp, " No Hydra %s", getboolean(nodes.NoHydra)); - fprintf(fp, " No TCP/IP IBN %s\n", getboolean(nodes.NoIBN)); - fprintf(fp, " No TCP/IP IFC %s", getboolean(nodes.NoIFC)); - fprintf(fp, " No TCP/IP ITN %s", getboolean(nodes.NoITN)); - fprintf(fp, " Pack Netmail %s\n", getboolean(nodes.PackNetmail)); - fprintf(fp, " ARCmail comp. %s", getboolean(nodes.ARCmailCompat)); - fprintf(fp, " ACRmail a..z %s", getboolean(nodes.ARCmailAlpha)); - fprintf(fp, " 8.3 filenames %s\n\n", getboolean(nodes.FNC)); + fprintf(fp, " Uplink mgrs Program Password\n"); + fprintf(fp, " ------------ --------- ---------------\n"); + fprintf(fp, " Files %s %s\n", padleft(nodes.UplFmgrPgm, 9, ' '), nodes.UplFmgrPass); + fprintf(fp, " Mail %s %s\n\n", padleft(nodes.UplAmgrPgm, 9, ' '), nodes.UplAmgrPass); - fprintf(fp, " Statistics Send KBytes Received KBytes\n"); - fprintf(fp, " ------------ -------- -------- -------- --------\n"); - fprintf(fp, " Total files %-8lu %-8lu %-8lu %-8lu\n", nodes.FilesSent.total, nodes.F_KbSent.total, nodes.FilesRcvd.total, nodes.F_KbSent.total); - fprintf(fp, " Total mail %-8lu %-8lu\n", nodes.MailSent.total, nodes.MailRcvd.total); + fprintf(fp, " Statistics Send KBytes Received KBytes\n"); + fprintf(fp, " ------------ -------- -------- -------- --------\n"); + fprintf(fp, " Total files %-8lu %-8lu %-8lu %-8lu\n", nodes.FilesSent.total, nodes.F_KbSent.total, nodes.FilesRcvd.total, nodes.F_KbSent.total); + fprintf(fp, " Total mail %-8lu %-8lu\n\n", nodes.MailSent.total, nodes.MailRcvd.total); - fprintf(fp, " Credit units %-8ld Warnlevel %ld\n", nodes.Credit, nodes.WarnLevel); - fprintf(fp, " Debet units %-8ld Stoplevel %ld\n", nodes.Debet, nodes.StopLevel); - fprintf(fp, " Add promille %ld\n", nodes.AddPerc); - fprintf(fp, "\n File groups:\n "); + fprintf(fp, " Credit units %-8ld Warnlevel %ld\n", nodes.Credit, nodes.WarnLevel); + fprintf(fp, " Debet units %-8ld Stoplevel %ld\n", nodes.Debet, nodes.StopLevel); + fprintf(fp, " Add promille %ld\n", nodes.AddPerc); + fprintf(fp, "\n File groups:\n "); groups = nodeshdr.filegrp / sizeof(group); for (i = 0; i < groups; i++) { fread(&group, sizeof(group), 1, no); if (strlen(group)) { fprintf(fp, "%-12s ", group); if (((i+1) % 5) == 0) - fprintf(fp, "\n "); + fprintf(fp, "\n "); } } if ((i+1) % 5) fprintf(fp, "\n"); - fprintf(fp, "\n Mail groups:\n "); + fprintf(fp, "\n Mail groups:\n "); groups = nodeshdr.mailgrp / sizeof(group); for (i = 0; i < groups; i++) { fread(&group, sizeof(group), 1, no); if (strlen(group)) { fprintf(fp, "%-12s ", group); if (((i+1) % 5) == 0) - fprintf(fp, "\n "); + fprintf(fp, "\n "); } } fprintf(fp, "\n"); diff --git a/mbtask/Makefile b/mbtask/Makefile index ff755c27..21353f8c 100644 --- a/mbtask/Makefile +++ b/mbtask/Makefile @@ -83,7 +83,7 @@ scanout.o: libs.h ../lib/structs.h taskutil.h scanout.h taskcomm.o: libs.h ../lib/structs.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskcomm.h taskinfo.o: libs.h ../lib/structs.h taskinfo.h taskstat.o: libs.h ../lib/structs.h taskstat.h callstat.h outstat.h taskutil.h -mbtask.o: libs.h ../lib/structs.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h callstat.h outstat.h nodelist.h ports.h calllist.h ping.h mbtask.h +mbtask.o: libs.h ../lib/structs.h ../paths.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h callstat.h outstat.h nodelist.h ports.h calllist.h ping.h mbtask.h outstat.o: libs.h ../lib/structs.h taskutil.h taskstat.h scanout.h nodelist.h callstat.h ports.h outstat.h signame.o: signame.h taskdisk.o: libs.h ../lib/structs.h taskdisk.h taskutil.h diff --git a/mbtask/calllist.c b/mbtask/calllist.c index 6670d7b2..0baa010c 100644 --- a/mbtask/calllist.c +++ b/mbtask/calllist.c @@ -124,7 +124,7 @@ int check_calllist(void) } } } - tasklog('o', "%d systems to call", call_work); + tasklog('o', "%d system%s to call", call_work, (call_work == 1)?"":"s"); } else { if (s_scanout) sem_set((char *)"scanout", FALSE); diff --git a/mbtask/mbtask.c b/mbtask/mbtask.c index 6ee33ab0..d459a705 100644 --- a/mbtask/mbtask.c +++ b/mbtask/mbtask.c @@ -30,6 +30,7 @@ #include "libs.h" #include "../lib/structs.h" +#include "../paths.h" #include "signame.h" #include "taskstat.h" #include "taskutil.h" @@ -417,7 +418,8 @@ void load_taskcfg(void) sprintf(TCFG.cmd_mailin, "%s/bin/mbfido tic toss web -quiet", getenv("MBSE_ROOT")); sprintf(TCFG.cmd_newnews, "%s/bin/mbfido news web -quiet", getenv("MBSE_ROOT")); sprintf(TCFG.cmd_mbindex1, "%s/bin/mbindex -quiet", getenv("MBSE_ROOT")); - sprintf(TCFG.cmd_mbindex2, "%s/bin/goldnode -f -q", getenv("MBSE_ROOT")); + if (strlen(_PATH_GOLDNODE)) + sprintf(TCFG.cmd_mbindex2, "%s/bin/goldnode -f -q", getenv("MBSE_ROOT")); sprintf(TCFG.cmd_msglink, "%s/bin/mbmsg link -quiet", getenv("MBSE_ROOT")); sprintf(TCFG.cmd_reqindex, "%s/bin/mbfile index -quiet", getenv("MBSE_ROOT")); TCFG.debug = FALSE; diff --git a/mbtask/outstat.c b/mbtask/outstat.c index fc33201f..1f1d2057 100644 --- a/mbtask/outstat.c +++ b/mbtask/outstat.c @@ -82,7 +82,6 @@ int load_node(fidoaddr n) (n.node == nodes.Aka[i].node) && (n.point == nodes.Aka[i].point)) { fclose(fp); free(temp); -// tasklog('-' , "Node record %d, aka nr %d", j, i+1); return TRUE; } } @@ -188,13 +187,17 @@ int outstat() { int rc, first = TRUE, T_window, iszmh = FALSE; struct _alist *tmp, *old; - char flstr[13]; - char temp[81]; - char as[6], be[6], utc[6]; + char flstr[13], *temp, as[6], be[6], utc[6], flavor; time_t now; struct tm *tm; int uhour, umin, thour, tmin; pp_list *tpl; + faddr *fa; + FILE *fp; + DIR *dp = NULL; + struct dirent *de; + struct stat sb; + struct passwd *pw; now = time(NULL); tm = gmtime(&now); /* UTC time */ @@ -220,6 +223,90 @@ int outstat() return rc; } + /* + * Check private outbound box for nodes in the setup. + */ + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s/etc/nodes.data", getenv("MBSE_ROOT")); + if ((fp = fopen(temp, "r")) == NULL) { + tasklog('?', "Error open %s, aborting", temp); + free(temp); + return 1; + } + fread(&nodeshdr, sizeof(nodeshdr), 1, fp); + fseek(fp, 0, SEEK_SET); + fread(&nodeshdr, nodeshdr.hdrsize, 1, fp); + pw = getpwnam((char *)"mbse"); + + while ((fread(&nodes, nodeshdr.recsize, 1, fp)) == 1) { + if (strlen(nodes.OutBox)) { + if (nodes.Crash) + flavor = 'c'; + else if (nodes.Hold) + flavor = 'h'; + else + flavor = 'o'; + + fa = (faddr *)malloc(sizeof(faddr)); + fa->name = NULL; + fa->domain = xstrcpy(nodes.Aka[0].domain); + fa->zone = nodes.Aka[0].zone; + fa->net = nodes.Aka[0].net; + fa->node = nodes.Aka[0].node; + fa->point = nodes.Aka[0].point; + + if ((dp = opendir(nodes.OutBox)) != NULL) { + while ((de = readdir(dp))) { + if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { + sprintf(temp, "%s/%s", nodes.OutBox, de->d_name); + if (stat(temp, &sb) == 0) { + if (S_ISREG(sb.st_mode)) { + if (pw->pw_uid == sb.st_uid) { + /* + * We own the file + */ + if ((sb.st_mode & S_IRUSR) && (sb.st_mode & S_IWUSR)) { + each(fa, flavor, OUT_FIL, temp); + } else { + tasklog('+', "No R/W permission on %s", temp); + } + } else if (pw->pw_gid == sb.st_gid) { + /* + * We own the file group + */ + if ((sb.st_mode & S_IRGRP) && (sb.st_mode & S_IWGRP)) { + each(fa, flavor, OUT_FIL, temp); + } else { + tasklog('+', "No R/W permission on %s", temp); + } + } else { + /* + * No owner of file + */ + if ((sb.st_mode & S_IROTH) && (sb.st_mode & S_IWOTH)) { + each(fa, flavor, OUT_FIL, temp); + } else { + tasklog('+', "No R/W permission on %s", temp); + } + } + } else { + tasklog('+', "Not a regular file: %s", temp); + } + } else { + tasklog('?', "Can't stat %s", temp); + } + } + } + closedir(dp); + } + if (fa->domain) + free(fa->domain); + free(fa); + } + fseek(fp, nodeshdr.filegrp + nodeshdr.mailgrp, SEEK_CUR); + } + fclose(fp); + /* * During processing the outbound list, determine when the next event will occur, * ie. the time when the callout status of a node changes because of starting a @@ -227,7 +314,7 @@ int outstat() */ for (tmp = alist; tmp; tmp = tmp->next) { if (first) { - tasklog('+', "Flavor Out Size Online Modem ISDN TCP/IP Calls Status Mode Address"); + tasklog('+', "Flavor Out Size Online Modem ISDN TCP/IP Calls Status Mode Address"); first = FALSE; } @@ -309,7 +396,7 @@ int outstat() } } // tasklog('o', "T_window=%s, iszmh=%s", T_window?"true":"false", iszmh?"true":"false"); - strcpy(flstr,"...... ... .."); + strcpy(flstr,"...... .... .."); /* * If the node has internet and we have internet configured, @@ -351,8 +438,11 @@ int outstat() flstr[5]='P'; tmp->flavors |= F_CALL; } + + if ((tmp->flavors) & F_ISFIL ) + flstr[7]='A'; if ((tmp->flavors) & F_ISPKT ) { - flstr[7]='M'; + flstr[8]='M'; /* * Normal mail, send during ZMH or if node has a Txx window. */ @@ -361,7 +451,7 @@ int outstat() } } if ((tmp->flavors) & F_ISFLO ) - flstr[8]='F'; + flstr[9]='F'; if (tmp->cst.tryno >= 30) { /* @@ -370,11 +460,11 @@ int outstat() tmp->flavors &= ~F_CALL; } if ((tmp->flavors) & F_CALL) - flstr[9]='C'; + flstr[10]='C'; if (tmp->t1) - flstr[11] = tmp->t1; + flstr[12] = tmp->t1; if (tmp->t2) - flstr[12] = tmp->t2; + flstr[13] = tmp->t2; /* * If forbidden to call from setup, clear callflag. @@ -464,8 +554,9 @@ int outstat() /* * Log results */ - tasklog('+', "Inet=%d, ISDN=%d, POTS=%d, Next event at %02d:%02d UTC", + tasklog('+', "Systems to call: Inet=%d, ISDN=%d, POTS=%d, Next event at %02d:%02d UTC", inet_calls, isdn_calls, pots_calls, nxt_hour, nxt_min); + free(temp); return 0; } @@ -480,7 +571,7 @@ int each(faddr *addr, char flavor, int isflo, char *fname) node *nlent; callstat *cst; - if ((isflo != OUT_PKT) && (isflo != OUT_FLO) && (isflo != OUT_REQ) && (isflo != OUT_POL)) + if ((isflo != OUT_PKT) && (isflo != OUT_FLO) && (isflo != OUT_REQ) && (isflo != OUT_POL) && (isflo != OUT_FIL)) return 0; for (tmp = &alist; *tmp; tmp = &((*tmp)->next)) @@ -525,7 +616,7 @@ int each(faddr *addr, char flavor, int isflo, char *fname) (*tmp)->cst.tryno = cst->tryno; (*tmp)->cst.trystat = cst->trystat; - if ((isflo == OUT_FLO) || (isflo == OUT_PKT)) + if ((isflo == OUT_FLO) || (isflo == OUT_PKT) || (isflo == OUT_FIL)) switch (flavor) { case '?': break; case 'i': (*tmp)->flavors |= F_IMM; break; @@ -602,6 +693,9 @@ int each(faddr *addr, char flavor, int isflo, char *fname) (*tmp)->flavors |= F_FREQ; } else if (isflo == OUT_POL) { (*tmp)->flavors |= F_POLL; + } else if (isflo == OUT_FIL) { + (*tmp)->size += st.st_size; + (*tmp)->flavors |= F_ISFIL; } return 0; diff --git a/mbtask/outstat.h b/mbtask/outstat.h index 9b1ccc83..1a496947 100644 --- a/mbtask/outstat.h +++ b/mbtask/outstat.h @@ -43,7 +43,8 @@ typedef struct _alist #define F_POLL 0x0020 #define F_ISFLO 0x0040 #define F_ISPKT 0x0080 -#define F_CALL 0x0100 +#define F_ISFIL 0x0100 +#define F_CALL 0x0200 diff --git a/mbtask/ping.c b/mbtask/ping.c index 7b79873f..251d6d51 100644 --- a/mbtask/ping.c +++ b/mbtask/ping.c @@ -336,7 +336,7 @@ void check_ping(void) * Reply received. */ rc = time(NULL) - (pingtime - 20); - if (rc != 1) + if (rc > 2) tasklog('p', "ping: reply after %d seconds", rc); pingresult[pingnr] = TRUE; if (pingresult[1] || pingresult[2]) { diff --git a/mbtask/scanout.h b/mbtask/scanout.h index 9ebccf61..62196cb5 100644 --- a/mbtask/scanout.h +++ b/mbtask/scanout.h @@ -10,6 +10,7 @@ #define OUT_ARC 3 #define OUT_REQ 4 #define OUT_POL 5 +#define OUT_FIL 6 extern int scanout(int (*)(faddr*,char,int,char*)); diff --git a/paths.h.in b/paths.h.in index 6f4eef97..b5c65cf0 100644 --- a/paths.h.in +++ b/paths.h.in @@ -40,3 +40,10 @@ #define _PATH_SZ "@SZ@" + +/* + * GoldED + */ +#define _PATH_GOLDED "@GOLDEDBIN@" +#define _PATH_GOLDNODE "@GOLDNODE@" +