Finished new outbound queue
This commit is contained in:
382
mbcico/mbout.c
382
mbcico/mbout.c
@@ -168,200 +168,210 @@ void Fatal(char *msg)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char *cmd, flavor = 'x';
|
||||
int i, j, rc = 0;
|
||||
struct passwd *pw;
|
||||
faddr *addr = NULL;
|
||||
node *nlent;
|
||||
char *cmd, flavor = 'x';
|
||||
int i, j, rc = 0;
|
||||
struct passwd *pw;
|
||||
faddr *addr = NULL;
|
||||
node *nlent;
|
||||
FILE *fl;
|
||||
|
||||
#ifdef MEMWATCH
|
||||
mwInit();
|
||||
mwInit();
|
||||
#endif
|
||||
InitConfig();
|
||||
InitNode();
|
||||
InitFidonet();
|
||||
TermInit(1);
|
||||
t_start = time(NULL);
|
||||
umask(002);
|
||||
InitConfig();
|
||||
InitNode();
|
||||
InitFidonet();
|
||||
TermInit(1);
|
||||
t_start = time(NULL);
|
||||
umask(002);
|
||||
|
||||
/*
|
||||
* Catch all signals we can, and ignore the rest.
|
||||
*/
|
||||
for (i = 0; i < NSIG; i++) {
|
||||
if ((i == SIGHUP) || (i == SIGINT) || (i == SIGBUS) ||
|
||||
(i == SIGILL) || (i == SIGSEGV) || (i == SIGTERM) ||
|
||||
(i == SIGKILL))
|
||||
signal(i, (void (*))die);
|
||||
else
|
||||
signal(i, SIG_IGN);
|
||||
}
|
||||
|
||||
if(argc < 2)
|
||||
Help();
|
||||
|
||||
cmd = xstrcpy((char *)"Command line: mbout");
|
||||
|
||||
if (argc > 1) {
|
||||
cmd = xstrcat(cmd, (char *)" ");
|
||||
cmd = xstrcat(cmd, argv[1]);
|
||||
|
||||
if (!strncasecmp(argv[1], "a", 1))
|
||||
do_attach = TRUE;
|
||||
if (!strncasecmp(argv[1], "n", 1))
|
||||
do_node = TRUE;
|
||||
if (!strncasecmp(argv[1], "p", 1))
|
||||
do_poll = TRUE;
|
||||
if (!strncasecmp(argv[1], "req", 3))
|
||||
do_req = TRUE;
|
||||
if (!strncasecmp(argv[1], "res", 3))
|
||||
do_reset = TRUE;
|
||||
if (!strncasecmp(argv[1], "sta", 3))
|
||||
do_stat = TRUE;
|
||||
if (!strncasecmp(argv[1], "sto", 3))
|
||||
do_stop = TRUE;
|
||||
}
|
||||
|
||||
for (i = 2; i < argc; i++) {
|
||||
|
||||
cmd = xstrcat(cmd, (char *)" ");
|
||||
cmd = xstrcat(cmd, argv[i]);
|
||||
|
||||
if (!strncasecmp(argv[i], "-q", 2))
|
||||
do_quiet = TRUE;
|
||||
}
|
||||
|
||||
ProgName();
|
||||
pw = getpwuid(getuid());
|
||||
InitClient(pw->pw_name, (char *)"mbout", CFG.location, CFG.logfile, CFG.util_loglevel, CFG.error_log);
|
||||
Syslog(' ', " ");
|
||||
Syslog(' ', "MBOUT v%s", VERSION);
|
||||
Syslog(' ', cmd);
|
||||
free(cmd);
|
||||
|
||||
if (!do_quiet) {
|
||||
colour(3, 0);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (do_stat) {
|
||||
rc = outstat();
|
||||
if (rc)
|
||||
rc += 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get node number from commandline
|
||||
*/
|
||||
if (do_attach || do_node || do_poll || do_stop || do_req || do_reset) {
|
||||
if (argc < 3)
|
||||
Fatal((char *)"Not enough parameters");
|
||||
}
|
||||
|
||||
if (do_attach || do_node || do_req || do_reset) {
|
||||
if ((addr = parsefaddr(argv[2])) == NULL)
|
||||
Fatal((char *)"Unrecognizable address");
|
||||
}
|
||||
|
||||
if (do_node) {
|
||||
rc = nlinfo(addr);
|
||||
tidy_faddr(addr);
|
||||
if (rc)
|
||||
rc += 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
if (do_poll || do_stop) {
|
||||
for (i = 3; i <= argc; i++) {
|
||||
if (strncasecmp(argv[i-1], "-q", 2)) {
|
||||
if ((addr = parsefaddr(argv[i-1])) == NULL)
|
||||
Fatal((char *)"Unrecognizable address");
|
||||
j = poll(addr, do_stop);
|
||||
tidy_faddr(addr);
|
||||
if (j > rc)
|
||||
rc = j;
|
||||
}
|
||||
}
|
||||
if (rc)
|
||||
rc = 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
if (do_reset) {
|
||||
for (i = 3; i <= argc; i++) {
|
||||
if (strncasecmp(argv[i-1], "-q", 2)) {
|
||||
if ((addr = parsefaddr(argv[i-1])) == NULL)
|
||||
Fatal((char *)"Unrecognizable address");
|
||||
j = reset(addr);
|
||||
tidy_faddr(addr);
|
||||
if (j > rc)
|
||||
rc = j;
|
||||
}
|
||||
}
|
||||
if (rc)
|
||||
rc = 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
if (do_attach) {
|
||||
if (argc < 5)
|
||||
Fatal((char *)"Not enough parameters");
|
||||
flavor = tolower(argv[3][0]);
|
||||
switch (flavor) {
|
||||
case 'n' : flavor = 'f'; break;
|
||||
case 'i' : flavor = 'i'; break;
|
||||
case 'c' : flavor = 'c'; break;
|
||||
case 'h' : flavor = 'h'; break;
|
||||
default : Fatal((char *)"Invalid flavor, must be: immediate, crash, normal or hold");
|
||||
}
|
||||
|
||||
nlent = getnlent(addr);
|
||||
if (nlent->pflag == NL_DUMMY)
|
||||
Fatal((char *)"Node is not in nodelist");
|
||||
if (nlent->pflag == NL_DOWN)
|
||||
Fatal((char *)"Node has status Down");
|
||||
if (nlent->pflag == NL_HOLD)
|
||||
Fatal((char *)"Node has status Hold");
|
||||
if (((nlent->oflags & OL_CM) == 0) && (flavor == 'c'))
|
||||
Fatal((char *)"Node is not CM, must use Immediate, Normal or Hold flavor");
|
||||
|
||||
if (argv[4][0] == '-')
|
||||
Fatal((char *)"Invalid filename given");
|
||||
if (file_exist(argv[4], R_OK) != 0)
|
||||
Fatal((char *)"File doesn't exist");
|
||||
|
||||
if (attach(*addr, argv[4], LEAVE, flavor)) {
|
||||
Syslog('+', "File attach %s is successfull", argv[4]);
|
||||
if (!do_quiet)
|
||||
printf("File attach %s is successfull", argv[4]);
|
||||
CreateSema((char *)"scanout");
|
||||
tidy_faddr(addr);
|
||||
die(0);
|
||||
} else {
|
||||
Fatal((char *)"File attach failed");
|
||||
}
|
||||
}
|
||||
|
||||
if (do_req) {
|
||||
if (argc < 4)
|
||||
Fatal((char *)"Not enough parameters");
|
||||
for (i = 4; i <= argc; i++) {
|
||||
if (strncasecmp(argv[i-1], "-q", 2)) {
|
||||
rc = freq(addr, argv[i-1]);
|
||||
if (rc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rc)
|
||||
rc += 100;
|
||||
die(rc);
|
||||
}
|
||||
/*
|
||||
* Catch all signals we can, and ignore the rest.
|
||||
*/
|
||||
for (i = 0; i < NSIG; i++) {
|
||||
if ((i == SIGHUP) || (i == SIGINT) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV) || (i == SIGTERM) || (i == SIGKILL))
|
||||
signal(i, (void (*))die);
|
||||
else
|
||||
signal(i, SIG_IGN);
|
||||
}
|
||||
|
||||
if(argc < 2)
|
||||
Help();
|
||||
|
||||
cmd = xstrcpy((char *)"Command line: mbout");
|
||||
|
||||
if (argc > 1) {
|
||||
cmd = xstrcat(cmd, (char *)" ");
|
||||
cmd = xstrcat(cmd, argv[1]);
|
||||
|
||||
if (!strncasecmp(argv[1], "a", 1))
|
||||
do_attach = TRUE;
|
||||
if (!strncasecmp(argv[1], "n", 1))
|
||||
do_node = TRUE;
|
||||
if (!strncasecmp(argv[1], "p", 1))
|
||||
do_poll = TRUE;
|
||||
if (!strncasecmp(argv[1], "req", 3))
|
||||
do_req = TRUE;
|
||||
if (!strncasecmp(argv[1], "res", 3))
|
||||
do_reset = TRUE;
|
||||
if (!strncasecmp(argv[1], "sta", 3))
|
||||
do_stat = TRUE;
|
||||
if (!strncasecmp(argv[1], "sto", 3))
|
||||
do_stop = TRUE;
|
||||
}
|
||||
|
||||
for (i = 2; i < argc; i++) {
|
||||
|
||||
cmd = xstrcat(cmd, (char *)" ");
|
||||
cmd = xstrcat(cmd, argv[i]);
|
||||
|
||||
if (!strncasecmp(argv[i], "-q", 2))
|
||||
do_quiet = TRUE;
|
||||
}
|
||||
|
||||
ProgName();
|
||||
pw = getpwuid(getuid());
|
||||
InitClient(pw->pw_name, (char *)"mbout", CFG.location, CFG.logfile, CFG.util_loglevel, CFG.error_log);
|
||||
Syslog(' ', " ");
|
||||
Syslog(' ', "MBOUT v%s", VERSION);
|
||||
Syslog(' ', cmd);
|
||||
free(cmd);
|
||||
|
||||
if (!do_quiet) {
|
||||
colour(3, 0);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (strcmp(pw->pw_name, "mbse"))
|
||||
Fatal((char *)"You are not user 'mbse'");
|
||||
|
||||
if (do_stat) {
|
||||
rc = outstat();
|
||||
if (rc)
|
||||
rc += 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get node number from commandline
|
||||
*/
|
||||
if (do_attach || do_node || do_poll || do_stop || do_req || do_reset) {
|
||||
if (argc < 3)
|
||||
Fatal((char *)"Not enough parameters");
|
||||
}
|
||||
|
||||
if (do_attach || do_node || do_req || do_reset) {
|
||||
if ((addr = parsefaddr(argv[2])) == NULL)
|
||||
Fatal((char *)"Unrecognizable address");
|
||||
}
|
||||
|
||||
if (do_node) {
|
||||
rc = nlinfo(addr);
|
||||
tidy_faddr(addr);
|
||||
if (rc)
|
||||
rc += 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
if (do_poll || do_stop) {
|
||||
for (i = 3; i <= argc; i++) {
|
||||
if (strncasecmp(argv[i-1], "-q", 2)) {
|
||||
if ((addr = parsefaddr(argv[i-1])) == NULL)
|
||||
Fatal((char *)"Unrecognizable address");
|
||||
j = poll(addr, do_stop);
|
||||
tidy_faddr(addr);
|
||||
if (j > rc)
|
||||
rc = j;
|
||||
}
|
||||
}
|
||||
if (rc)
|
||||
rc = 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
if (do_reset) {
|
||||
for (i = 3; i <= argc; i++) {
|
||||
if (strncasecmp(argv[i-1], "-q", 2)) {
|
||||
if ((addr = parsefaddr(argv[i-1])) == NULL)
|
||||
Fatal((char *)"Unrecognizable address");
|
||||
j = reset(addr);
|
||||
tidy_faddr(addr);
|
||||
if (j > rc)
|
||||
rc = j;
|
||||
}
|
||||
}
|
||||
if (rc)
|
||||
rc = 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
if (do_attach) {
|
||||
if (argc < 5)
|
||||
Fatal((char *)"Not enough parameters");
|
||||
flavor = tolower(argv[3][0]);
|
||||
switch (flavor) {
|
||||
case 'n' : flavor = 'f'; break;
|
||||
case 'i' : flavor = 'i'; break;
|
||||
case 'c' : flavor = 'c'; break;
|
||||
case 'h' : flavor = 'h'; break;
|
||||
default : Fatal((char *)"Invalid flavor, must be: immediate, crash, normal or hold");
|
||||
}
|
||||
|
||||
nlent = getnlent(addr);
|
||||
if (nlent->pflag == NL_DUMMY)
|
||||
Fatal((char *)"Node is not in nodelist");
|
||||
if (nlent->pflag == NL_DOWN)
|
||||
Fatal((char *)"Node has status Down");
|
||||
if (nlent->pflag == NL_HOLD)
|
||||
Fatal((char *)"Node has status Hold");
|
||||
if (((nlent->oflags & OL_CM) == 0) && (flavor == 'c'))
|
||||
Fatal((char *)"Node is not CM, must use Immediate, Normal or Hold flavor");
|
||||
|
||||
if (argv[4][0] == '-')
|
||||
Fatal((char *)"Invalid filename given");
|
||||
if (file_exist(argv[4], R_OK) != 0)
|
||||
Fatal((char *)"File doesn't exist");
|
||||
|
||||
cmd = calloc(PATH_MAX, sizeof(char));
|
||||
sprintf(cmd, "%s/%d.%d.%d.%d/.filelist", CFG.out_queue, addr->zone, addr->net, addr->node, addr->point);
|
||||
mkdirs(cmd, 0750);
|
||||
if ((fl = fopen(cmd, "a+")) == NULL) {
|
||||
Fatal((char *)"File attach failed");
|
||||
} else {
|
||||
fprintf(fl, "%c LEAVE %s\n", flavor, argv[4]);
|
||||
Syslog('+', "File attach %s is successfull", argv[4]);
|
||||
if (!do_quiet)
|
||||
printf("File attach %s is successfull", argv[4]);
|
||||
CreateSema((char *)"mailin");
|
||||
tidy_faddr(addr);
|
||||
fsync(fileno(fl));
|
||||
fclose(fl);
|
||||
free(cmd);
|
||||
die(0);
|
||||
}
|
||||
free(cmd);
|
||||
}
|
||||
|
||||
if (do_req) {
|
||||
if (argc < 4)
|
||||
Fatal((char *)"Not enough parameters");
|
||||
for (i = 4; i <= argc; i++) {
|
||||
if (strncasecmp(argv[i-1], "-q", 2)) {
|
||||
rc = freq(addr, argv[i-1]);
|
||||
if (rc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rc)
|
||||
rc += 100;
|
||||
die(rc);
|
||||
}
|
||||
|
||||
Help();
|
||||
#ifdef MEMWATCH
|
||||
mwTerm();
|
||||
mwTerm();
|
||||
#endif
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user