Newer
Older
/* Synchronet file transfer-related command shell/module routines */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
#include "cmdshell.h"
#include "filedat.h"
char str[256], ch;
int s;
int i, j, x, y;
file_t f;
switch (*(csi->ip++)) {
csi->logic = LOGIC_FALSE;
while (online) {
j = 0;
if (usrlibs > 1) {
if (!menu("libs", P_NOERROR)) {
for (i = 0; i < usrlibs && !msgabort(); i++) {
if (i == curlib)
else
outchar(' ');
if (i < 9)
outchar(' ');
if (i < 99)
outchar(' ');
, i + 1, cfg.lib[usrlib[i]]->lname);
}
snprintf(str, sizeof str, text[JoinWhichLib], curlib + 1);

rswindell
committed
clear_hotspots();
snprintf(str, sizeof str, "dirs%u", usrlib[j] + 1);
if (!menu(str, P_NOERROR)) {
CLS;
bprintf(text[DirLstHdr], cfg.lib[usrlib[j]]->lname);
for (i = 0; i < usrdirs[j] && !msgabort(); i++) {
if (i == curdir[j])
outchar('*');
else
outchar(' ');
snprintf(str, sizeof str, text[DirLstFmt], i + 1
, cfg.dir[usrdir[j][i]]->lname, nulstr
, getfiles(&cfg, usrdir[j][i]));
if (i < 9)
outchar(' ');
if (i < 99)
outchar(' ');
add_hotspot(i + 1);
bputs(str);
}
snprintf(str, sizeof str, text[JoinWhichDir], curdir[j] + 1);
i = getnum(usrdirs[j]);

rswindell
committed
clear_hotspots();
if ((int)i == -1) {
if (usrlibs == 1)
if (!i)
i = curdir[j];
curlib = j;
curdir[curlib] = i;
csi->logic = LOGIC_TRUE;
case CS_FILE_GET_DIR_NUM:
if (useron.misc & COLDKEYS) {
i = atoi(csi->str);
if (i && i <= usrdirs[curlib] && usrlibs)
curdir[curlib] = i - 1;
if ((ch & 0xf) * 10 <= usrdirs[curlib] && (ch & 0xf) && usrlibs) {
i = (ch & 0xf) * 10;
ch = getkey(K_UPPER);
if (!IS_DIGIT(ch) && ch != CR) {
curdir[curlib] = (i / 10) - 1;
if (ch == CR) {
curdir[curlib] = (i / 10) - 1;
logch(ch, 0);
i += ch & 0xf;
if (i * 10 <= usrdirs[curlib]) { /* 100+ dirs */
i *= 10;
ch = getkey(K_UPPER);
if (!IS_DIGIT(ch) && ch != CR) {
curdir[curlib] = (i / 10) - 1;
if (ch == CR) {
curdir[curlib] = (i / 10) - 1;
logch(ch, 0);
i += ch & 0xf;
if (i <= usrdirs[curlib])
curdir[curlib] = i - 1;
if (keybuf_level() && (ch = getkey(K_UPPER)) != '\r')
ungetkey(ch, /* insert: */ true);
if ((ch & 0xf) <= (int)usrdirs[curlib] && (ch & 0xf) && usrlibs)
curdir[curlib] = (ch & 0xf) - 1;
case CS_FILE_GET_LIB_NUM:
if (useron.misc & COLDKEYS) {
i = atoi(csi->str);
if (i && i <= usrlibs)
curlib = i - 1;
if ((ch & 0xf) * 10 <= usrlibs && (ch & 0xf)) {
i = (ch & 0xf) * 10;
ch = getkey(K_UPPER);
if (!IS_DIGIT(ch) && ch != CR) {
curlib = (i / 10) - 1;
if (ch == CR) {
curlib = (i / 10) - 1;
logch(ch, 0);
i += ch & 0xf;
if (i <= usrlibs)
curlib = i - 1;
if (keybuf_level() && (ch = getkey(K_UPPER)) != '\r')
ungetkey(ch, /* insert: */ true);
if ((ch & 0xf) <= (int)usrlibs && (ch & 0xf))
curlib = (ch & 0xf) - 1;
if (keybuf_level() && (ch = getkey(K_UPPER)) != '\r')
ungetkey(ch, /* insert: */ true);
case CS_FILE_SHOW_LIBRARIES:
if (!usrlibs)
return 0;
if (menu("libs", P_NOERROR)) {
for (i = 0; i < usrlibs && !msgabort(); i++) {
if (i == curlib)
else
outchar(' ');
if (i < 9)
outchar(' ');
add_hotspot(i + 1);
bprintf(text[LibLstFmt], i + 1
, cfg.lib[usrlib[i]]->lname, nulstr, usrdirs[i]);
case CS_FILE_SHOW_DIRECTORIES:
if (!usrlibs)
return 0;
snprintf(str, sizeof str, "dirs%u", usrlib[curlib] + 1);
if (menu(str, P_NOERROR)) {
bprintf(text[DirLstHdr], cfg.lib[usrlib[curlib]]->lname);
for (i = 0; i < usrdirs[curlib] && !msgabort(); i++) {
if (i == curdir[curlib])
outchar('*');
else
outchar(' ');
snprintf(str, sizeof str, text[DirLstFmt], i + 1
, cfg.dir[usrdir[curlib][i]]->lname, nulstr
, getfiles(&cfg, usrdir[curlib][i]));
if (i < 9)
outchar(' ');
if (i < 99)
outchar(' ');
add_hotspot(i + 1);
bputs(str);
case CS_FILE_LIBRARY_UP:
curlib++;
if (curlib >= usrlibs)
curlib = 0;
if (!curlib)
curlib = usrlibs - 1;
if (!usrlibs)
return 0;
if (curdir[curlib] >= usrdirs[curlib])
curdir[curlib] = 0;
if (!usrlibs)
return 0;
if (!curdir[curlib])
curdir[curlib] = usrdirs[curlib] - 1;
csi->logic = LOGIC_TRUE;
for (i = 0; i < usrlibs; i++)
for (j = 0; j < usrdirs[i]; j++)
if (!stricmp(csi->str, cfg.dir[usrdir[i][j]]->code)) {
curlib = i;
curdir[i] = j;
csi->logic = LOGIC_FALSE;
csi->logic = LOGIC_TRUE;
for (i = 0; i < usrlibs; i++)
if (!stricmp(cfg.lib[usrlib[i]]->sname, csi->str))
if (i < usrlibs)
curlib = i;
csi->logic = LOGIC_FALSE;
csi->logic = LOGIC_FALSE;
if (usrlibs) {
i = usrdir[curlib][curdir[curlib]];
if (cfg.upload_dir != INVALID_DIR
&& !user_can_upload(&cfg, i, &useron, &client, /* reason: */ NULL))
i = cfg.upload_dir;
} else
i = cfg.upload_dir;
csi->logic = upload(i) ? LOGIC_TRUE:LOGIC_FALSE;
csi->logic = LOGIC_FALSE;
if (cfg.user_dir == INVALID_DIR) {
}
csi->logic = upload(cfg.user_dir) ? LOGIC_TRUE:LOGIC_FALSE;
csi->logic = LOGIC_FALSE;
if (cfg.sysop_dir == INVALID_DIR) {
}
csi->logic = upload(cfg.sysop_dir) ? LOGIC_TRUE:LOGIC_FALSE;
if (!usrlibs)
return 0;
if (useron.rest & FLAG('D')) {
if (!listfileinfo(usrdir[curlib][curdir[curlib]], csi->str, FI_DOWNLOAD)
&& strcmp(csi->str, ALLFILES) != 0) {
bputs(text[SearchingAllDirs]);
for (i = 0; i < usrdirs[curlib]; i++) {
if (msgabort()) {
bputs(text[Aborted]);
}
progress(text[Scanning], i, usrdirs[curlib]);
if (i != curdir[curlib] &&
(s = listfileinfo(usrdir[curlib][i], csi->str, FI_DOWNLOAD)) != 0)
if (s == -1 || (!strchr(csi->str, '?') && !strchr(csi->str, '*')))
bputs(text[Scanned]);
bputs(text[SearchingAllLibs]);
for (i = 0; i < usrlibs; i++) {
progress(text[Scanning], i, usrlibs);
if (i == curlib)
continue;
for (j = 0; j < usrdirs[i]; j++) {
if (msgabort()) {
bputs(text[Aborted]);
if ((s = listfileinfo(usrdir[i][j], csi->str, FI_DOWNLOAD)) != 0)
if (s == -1 || (!strchr(csi->str, '?') && !strchr(csi->str, '*')))
}
bputs(text[Scanned]);
case CS_FILE_DOWNLOAD_USER: /* Download from user dir */
csi->logic = LOGIC_FALSE;
if (cfg.user_dir == INVALID_DIR) {
if (useron.rest & FLAG('D')) {
if (!listfileinfo(cfg.user_dir, nulstr, FI_USERXFER))
bputs(text[NoFilesForYou]);
else
csi->logic = LOGIC_TRUE;
if (batdn_total() > 0
&& (text[DownloadBatchQ][0] == 0 || yesno(text[DownloadBatchQ]))) {
csi->logic = LOGIC_TRUE;
csi->logic = LOGIC_FALSE;
case CS_FILE_BATCH_ADD_LIST:
batch_add_list(csi->str);
csi->logic = LOGIC_FALSE;
if (!csi->str[0])
for (x = y = 0; x < usrlibs; x++) {
for (y = 0; y < usrdirs[x]; y++) {
if (msgabort())
if (loadfile(&cfg, usrdir[x][y], csi->str, &f, file_detail_normal)) {
addtobatdl(&f);
smb_freefilemem(&f);
csi->logic = LOGIC_TRUE;
return 0;
}
}
csi->logic = clearbatdl() ? LOGIC_TRUE : LOGIC_FALSE;
if (!usrlibs)
return 0;
csi->logic = LOGIC_TRUE;
if (listfiles(usrdir[curlib][curdir[curlib]], csi->str, 0, FL_VIEW)
|| strcmp(csi->str, ALLFILES) == 0)
bputs(text[SearchingAllDirs]);
for (i = 0; i < usrdirs[curlib]; i++) {
if (msgabort()) {
bputs(text[Aborted]);
}
progress(text[Scanning], i, usrdirs[curlib]);
if (i == curdir[curlib])
continue;
if (listfiles(usrdir[curlib][i], csi->str, 0, FL_VIEW))
break;
bputs(text[Scanned]);
if (i < usrdirs[curlib])
bputs(text[SearchingAllLibs]);
for (i = 0; i < usrlibs; i++) {
progress(text[Scanning], i, usrlibs);
if (i == curlib)
continue;
for (j = 0; j < usrdirs[i]; j++) {
if (msgabort()) {
bputs(text[Aborted]);
if (listfiles(usrdir[i][j], csi->str, 0, FL_VIEW))
bputs(text[Scanned]);
csi->logic = LOGIC_FALSE;
case CS_FILE_LIST: /* List files in current dir */
if (!usrlibs)
return 0;
csi->logic = LOGIC_FALSE;
if (!getfiles(&cfg, usrdir[curlib][curdir[curlib]])) {
s = listfiles(usrdir[curlib][curdir[curlib]], csi->str, 0, 0);
if (s > 1) {
bprintf(text[NFilesListed], s);
case CS_FILE_LIST_EXTENDED: /* Extended Information on files */
if (!usrlibs)
return 0;
if (!listfileinfo(usrdir[curlib][curdir[curlib]], csi->str, FI_INFO)
&& strcmp(csi->str, ALLFILES) != 0) {
bputs(text[SearchingAllDirs]);
for (i = 0; i < usrdirs[curlib]; i++) {
if (msgabort()) {
bputs(text[Aborted]);
}
progress(text[Scanning], i, usrdirs[curlib]);
if (i != curdir[curlib] && (s = listfileinfo(usrdir[curlib][i]
, csi->str, FI_INFO)) != 0)
if (s == -1 || (!strchr(csi->str, '?') && !strchr(csi->str, '*')))
bputs(text[Scanned]);
bputs(text[SearchingAllLibs]);
for (i = 0; i < usrlibs; i++) {
progress(text[Scanning], i, usrlibs);
if (i == curlib)
continue;
for (j = 0; j < usrdirs[i]; j++) {
if (msgabort()) {
bputs(text[Aborted]);
if ((s = listfileinfo(usrdir[i][j], csi->str, FI_INFO)) != 0)
if (s == -1 || (!strchr(csi->str, '?') && !strchr(csi->str, '*')))
}
bputs(text[Scanned]);
case CS_FILE_FIND_TEXT: /* Find text in descriptions */
scandirs(FL_FIND);
case CS_FILE_FIND_TEXT_ALL: /* Find text in descriptions */
scanalldirs(FL_FIND);
case CS_FILE_FIND_NAME: /* Find text in descriptions */
case CS_FILE_FIND_NAME_ALL: /* Find text in descriptions */
case CS_FILE_BATCH_SECTION:
batchmenu();
case CS_FILE_TEMP_SECTION:
temp_xfer();
csi->logic = !inputnstime(&ns_time);
case CS_FILE_NEW_SCAN:
scandirs(FL_ULTIME);
case CS_FILE_NEW_SCAN_ALL:
scanalldirs(FL_ULTIME);
if (!usrlibs)
return 0;
if (useron.rest & FLAG('R')) {
if (!listfileinfo(usrdir[curlib][curdir[curlib]], csi->str, FI_REMOVE)
&& strcmp(csi->str, ALLFILES) != 0) {
if (cfg.user_dir != INVALID_DIR
&& cfg.user_dir != usrdir[curlib][curdir[curlib]])
if ((s = listfileinfo(cfg.user_dir, csi->str, FI_REMOVE)) != 0)
if (s == -1 || (!strchr(csi->str, '?') && !strchr(csi->str, '*')))
bputs(text[SearchingAllDirs]);
for (i = 0; i < usrdirs[curlib]; i++) {
if (msgabort()) {
bputs(text[Aborted]);
}
progress(text[Scanning], i, usrdirs[curlib]);
if (i != curdir[curlib] && i != cfg.user_dir
&& (s = listfileinfo(usrdir[curlib][i], csi->str, FI_REMOVE)) != 0)
if (s == -1 || (!strchr(csi->str, '?') && !strchr(csi->str, '*')))
bputs(text[Scanned]);
bputs(text[SearchingAllLibs]);
for (i = 0; i < usrlibs; i++) {
progress(text[Scanning], i, usrlibs);
if (i == curlib || i == cfg.user_dir)
continue;
for (j = 0; j < usrdirs[i]; j++) {
if (msgabort()) {
bputs(text[Aborted]);
if ((s = listfileinfo(usrdir[i][j], csi->str, FI_REMOVE)) != 0)
if (s == -1 || (!strchr(csi->str, '?') && !strchr(csi->str, '*')))
}
bputs(text[Scanned]);
errormsg(WHERE, ERR_CHK, "shell function", *(csi->ip - 1));