X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fctdlproto%2Fserv_file.c;h=9af465e4d2648386352b6305eef523018cbd5f8a;hb=dc48bee02071eb3eb2f535e203c36c528e1547a8;hp=2970f1ccd60522cb3e96ca59d5ad4df2d6b7b1a5;hpb=e750a47a92b48dfa6faf63a61a71f103871c9e5b;p=citadel.git diff --git a/citadel/modules/ctdlproto/serv_file.c b/citadel/modules/ctdlproto/serv_file.c index 2970f1ccd..9af465e4d 100644 --- a/citadel/modules/ctdlproto/serv_file.c +++ b/citadel/modules/ctdlproto/serv_file.c @@ -1,47 +1,32 @@ /* * Server functions which handle file transfers and room directories. + * + * Copyright (c) 1987-2018 by the citadel.org team + * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -#include "sysdep.h" #include #include #include -#include -#include -#include -#include -#include -#include -#include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - -#include +#include #include -#include "citadel.h" -#include "server.h" -#include "config.h" -#include "files.h" -#include "sysdep_decls.h" -#include "support.h" -#include "room_ops.h" -#include "msgbase.h" -#include "citserver.h" -#include "threads.h" +#include +#include +#include #include "ctdl_module.h" +#include "citserver.h" +#include "support.h" +#include "config.h" #include "user_ops.h" - /* * Server command to delete a file from a room's directory */ @@ -54,14 +39,12 @@ void cmd_delf(char *filename) return; if ((CC->room.QRflags & QR_DIRECTORY) == 0) { - cprintf("%d No directory in this room.\n", - ERROR + NOT_HERE); + cprintf("%d No directory in this room.\n", ERROR + NOT_HERE); return; } if (IsEmptyStr(filename)) { - cprintf("%d You must specify a file name.\n", - ERROR + FILE_NOT_FOUND); + cprintf("%d You must specify a file name.\n", ERROR + FILE_NOT_FOUND); return; } for (a = 0; !IsEmptyStr(&filename[a]); ++a) { @@ -70,22 +53,20 @@ void cmd_delf(char *filename) } } snprintf(pathname, sizeof pathname, - "%s/%s/%s", - ctdl_file_dir, - CC->room.QRdirname, filename); + "%s/%s/%s", + ctdl_file_dir, + CC->room.QRdirname, filename + ); a = unlink(pathname); if (a == 0) { cprintf("%d File '%s' deleted.\n", CIT_OK, pathname); } else { - cprintf("%d File '%s' not found.\n", - ERROR + FILE_NOT_FOUND, pathname); + cprintf("%d File '%s' not found.\n", ERROR + FILE_NOT_FOUND, pathname); } } - - /* * move a file from one room directory to another */ @@ -105,14 +86,12 @@ void cmd_movf(char *cmdbuf) if (CtdlAccessCheck(ac_room_aide)) return; if ((CC->room.QRflags & QR_DIRECTORY) == 0) { - cprintf("%d No directory in this room.\n", - ERROR + NOT_HERE); + cprintf("%d No directory in this room.\n", ERROR + NOT_HERE); return; } if (IsEmptyStr(filename)) { - cprintf("%d You must specify a file name.\n", - ERROR + FILE_NOT_FOUND); + cprintf("%d You must specify a file name.\n", ERROR + FILE_NOT_FOUND); return; } @@ -121,11 +100,9 @@ void cmd_movf(char *cmdbuf) filename[a] = '_'; } } - snprintf(pathname, sizeof pathname, "./files/%s/%s", - CC->room.QRdirname, filename); + snprintf(pathname, sizeof pathname, "./files/%s/%s", CC->room.QRdirname, filename); if (access(pathname, 0) != 0) { - cprintf("%d File '%s' not found.\n", - ERROR + FILE_NOT_FOUND, pathname); + cprintf("%d File '%s' not found.\n", ERROR + FILE_NOT_FOUND, pathname); return; } @@ -134,23 +111,18 @@ void cmd_movf(char *cmdbuf) return; } if ((qrbuf.QRflags & QR_DIRECTORY) == 0) { - cprintf("%d '%s' is not a directory room.\n", - ERROR + NOT_HERE, qrbuf.QRname); + cprintf("%d '%s' is not a directory room.\n", ERROR + NOT_HERE, qrbuf.QRname); return; } - snprintf(newpath, sizeof newpath, "./files/%s/%s", qrbuf.QRdirname, - filename); + snprintf(newpath, sizeof newpath, "./files/%s/%s", qrbuf.QRdirname, filename); if (link(pathname, newpath) != 0) { - cprintf("%d Couldn't move file: %s\n", ERROR + INTERNAL_ERROR, - strerror(errno)); + cprintf("%d Couldn't move file: %s\n", ERROR + INTERNAL_ERROR, strerror(errno)); return; } unlink(pathname); /* this is a crude method of copying the file description */ - snprintf(buf, sizeof buf, - "cat ./files/%s/filedir |grep \"%s\" >>./files/%s/filedir", - CC->room.QRdirname, filename, qrbuf.QRdirname); + snprintf(buf, sizeof buf, "cat ./files/%s/filedir |grep \"%s\" >>./files/%s/filedir", CC->room.QRdirname, filename, qrbuf.QRdirname); system(buf); cprintf("%d File '%s' has been moved.\n", CIT_OK, filename); } @@ -174,8 +146,7 @@ void OpenCmdResult(char *filename, const char *mime_type) filesize = (long) statbuf.st_size; modtime = (time_t) statbuf.st_mtime; - cprintf("%d %ld|%ld|%s|%s\n", - CIT_OK, filesize, (long)modtime, filename, mime_type); + cprintf("%d %ld|%ld|%s|%s\n", CIT_OK, filesize, (long)modtime, filename, mime_type); } @@ -193,26 +164,22 @@ void cmd_open(char *cmdbuf) if (CtdlAccessCheck(ac_logged_in)) return; if ((CC->room.QRflags & QR_DIRECTORY) == 0) { - cprintf("%d No directory in this room.\n", - ERROR + NOT_HERE); + cprintf("%d No directory in this room.\n", ERROR + NOT_HERE); return; } if (IsEmptyStr(filename)) { - cprintf("%d You must specify a file name.\n", - ERROR + FILE_NOT_FOUND); + cprintf("%d You must specify a file name.\n", ERROR + FILE_NOT_FOUND); return; } if (strstr(filename, "../") != NULL) { - cprintf("%d syntax error.\n", - ERROR + ILLEGAL_VALUE); + cprintf("%d syntax error.\n", ERROR + ILLEGAL_VALUE); return; } if (CC->download_fp != NULL) { - cprintf("%d You already have a download file open.\n", - ERROR + RESOURCE_BUSY); + cprintf("%d You already have a download file open.\n", ERROR + RESOURCE_BUSY); return; } @@ -222,101 +189,52 @@ void cmd_open(char *cmdbuf) } } - snprintf(pathname, sizeof pathname, - "%s/%s/%s", - ctdl_file_dir, - CC->room.QRdirname, filename); + snprintf(pathname, sizeof pathname, "%s/%s/%s", ctdl_file_dir, CC->room.QRdirname, filename); CC->download_fp = fopen(pathname, "r"); if (CC->download_fp == NULL) { - cprintf("%d cannot open %s: %s\n", - ERROR + INTERNAL_ERROR, pathname, strerror(errno)); + cprintf("%d cannot open %s: %s\n", ERROR + INTERNAL_ERROR, pathname, strerror(errno)); return; } OpenCmdResult(filename, "application/octet-stream"); } + /* * open an image file */ void cmd_oimg(char *cmdbuf) { - char filename[256]; + char filename[PATH_MAX]; char pathname[PATH_MAX]; char MimeTestBuf[32]; - struct ctdluser usbuf; - char which_user[USERNAME_SIZE]; - int which_floor; - int a; int rv; extract_token(filename, cmdbuf, 0, '|', sizeof filename); if (IsEmptyStr(filename)) { - cprintf("%d You must specify a file name.\n", - ERROR + FILE_NOT_FOUND); + cprintf("%d You must specify a file name.\n", ERROR + FILE_NOT_FOUND); return; } if (CC->download_fp != NULL) { - cprintf("%d You already have a download file open.\n", - ERROR + RESOURCE_BUSY); + cprintf("%d You already have a download file open.\n", ERROR + RESOURCE_BUSY); return; } - if (!strcasecmp(filename, "_userpic_")) { - extract_token(which_user, cmdbuf, 1, '|', sizeof which_user); - if (CtdlGetUser(&usbuf, which_user) != 0) { - cprintf("%d No such user.\n", - ERROR + NO_SUCH_USER); - return; - } - snprintf(pathname, sizeof pathname, - "%s/%ld", - ctdl_usrpic_dir, - usbuf.usernum); - } else if (!strcasecmp(filename, "_floorpic_")) { - which_floor = extract_int(cmdbuf, 1); - snprintf(pathname, sizeof pathname, - "%s/floor.%d", - ctdl_image_dir, which_floor); - } else if (!strcasecmp(filename, "_roompic_")) { - assoc_file_name(pathname, sizeof pathname, &CC->room, ctdl_image_dir); - } else { - for (a = 0; !IsEmptyStr(&filename[a]); ++a) { - filename[a] = tolower(filename[a]); - if ( (filename[a] == '/') || (filename[a] == '\\') ) { - filename[a] = '_'; - } - } - if (strstr(filename, "../") != NULL) - { - cprintf("%d syntax error.\n", - ERROR + ILLEGAL_VALUE); - return; - } - - snprintf(pathname, sizeof pathname, - "%s/%s", - ctdl_image_dir, - filename); - } - CC->download_fp = fopen(pathname, "rb"); if (CC->download_fp == NULL) { strcat(pathname, ".gif"); CC->download_fp = fopen(pathname, "rb"); } if (CC->download_fp == NULL) { - cprintf("%d Cannot open %s: %s\n", - ERROR + FILE_NOT_FOUND, pathname, strerror(errno)); + cprintf("%d Cannot open %s: %s\n", ERROR + FILE_NOT_FOUND, pathname, strerror(errno)); return; } rv = fread(&MimeTestBuf[0], 1, 32, CC->download_fp); if (rv == -1) { - cprintf("%d Cannot access %s: %s\n", - ERROR + FILE_NOT_FOUND, pathname, strerror(errno)); + cprintf("%d Cannot access %s: %s\n", ERROR + FILE_NOT_FOUND, pathname, strerror(errno)); return; } @@ -324,6 +242,7 @@ void cmd_oimg(char *cmdbuf) OpenCmdResult(pathname, GuessMimeType(&MimeTestBuf[0], 32)); } + /* * open a file for uploading */ @@ -338,20 +257,17 @@ void cmd_uopn(char *cmdbuf) if (CtdlAccessCheck(ac_logged_in)) return; if ((CC->room.QRflags & QR_DIRECTORY) == 0) { - cprintf("%d No directory in this room.\n", - ERROR + NOT_HERE); + cprintf("%d No directory in this room.\n", ERROR + NOT_HERE); return; } if (IsEmptyStr(CC->upl_file)) { - cprintf("%d You must specify a file name.\n", - ERROR + FILE_NOT_FOUND); + cprintf("%d You must specify a file name.\n", ERROR + FILE_NOT_FOUND); return; } if (CC->upload_fp != NULL) { - cprintf("%d You already have a upload file open.\n", - ERROR + RESOURCE_BUSY); + cprintf("%d You already have a upload file open.\n", ERROR + RESOURCE_BUSY); return; } @@ -360,35 +276,26 @@ void cmd_uopn(char *cmdbuf) CC->upl_file[a] = '_'; } } - snprintf(CC->upl_path, sizeof CC->upl_path, - "%s/%s/%s", - ctdl_file_dir, - CC->room.QRdirname, CC->upl_file); - snprintf(CC->upl_filedir, sizeof CC->upl_filedir, - "%s/%s/filedir", - ctdl_file_dir, - CC->room.QRdirname); + snprintf(CC->upl_path, sizeof CC->upl_path, "%s/%s/%s", ctdl_file_dir, CC->room.QRdirname, CC->upl_file); + snprintf(CC->upl_filedir, sizeof CC->upl_filedir, "%s/%s/filedir", ctdl_file_dir, CC->room.QRdirname); CC->upload_fp = fopen(CC->upl_path, "r"); if (CC->upload_fp != NULL) { fclose(CC->upload_fp); CC->upload_fp = NULL; - cprintf("%d '%s' already exists\n", - ERROR + ALREADY_EXISTS, CC->upl_path); + cprintf("%d '%s' already exists\n", ERROR + ALREADY_EXISTS, CC->upl_path); return; } CC->upload_fp = fopen(CC->upl_path, "wb"); if (CC->upload_fp == NULL) { - cprintf("%d Cannot open %s: %s\n", - ERROR + INTERNAL_ERROR, CC->upl_path, strerror(errno)); + cprintf("%d Cannot open %s: %s\n", ERROR + INTERNAL_ERROR, CC->upl_path, strerror(errno)); return; } cprintf("%d Ok\n", CIT_OK); } - /* * open an image file for uploading */ @@ -396,7 +303,6 @@ void cmd_uimg(char *cmdbuf) { int is_this_for_real; char basenm[256]; - int which_floor; int a; if (num_parms(cmdbuf) < 2) { @@ -408,8 +314,7 @@ void cmd_uimg(char *cmdbuf) extract_token(CC->upl_mimetype, cmdbuf, 1, '|', sizeof CC->upl_mimetype); extract_token(basenm, cmdbuf, 2, '|', sizeof basenm); if (CC->upload_fp != NULL) { - cprintf("%d You already have an upload file open.\n", - ERROR + RESOURCE_BUSY); + cprintf("%d You already have an upload file open.\n", ERROR + RESOURCE_BUSY); return; } @@ -423,35 +328,11 @@ void cmd_uimg(char *cmdbuf) } if (CC->user.axlevel >= AxAideU) { - snprintf(CC->upl_path, sizeof CC->upl_path, - "%s/%s", - ctdl_image_dir, - basenm); - } - - if (!strcasecmp(basenm, "_userpic_")) { - snprintf(CC->upl_path, sizeof CC->upl_path, - "%s/%ld.gif", - ctdl_usrpic_dir, - CC->user.usernum); - } - - if ((!strcasecmp(basenm, "_floorpic_")) - && (CC->user.axlevel >= AxAideU)) { - which_floor = extract_int(cmdbuf, 2); - snprintf(CC->upl_path, sizeof CC->upl_path, - "%s/floor.%d.gif", - ctdl_image_dir, - which_floor); - } - - if ((!strcasecmp(basenm, "_roompic_")) && (is_room_aide())) { - assoc_file_name(CC->upl_path, sizeof CC->upl_path, &CC->room, ctdl_image_dir); + snprintf(CC->upl_path, sizeof CC->upl_path, "%s/%s", ctdl_image_dir, basenm); } if (IsEmptyStr(CC->upl_path)) { - cprintf("%d Higher access required.\n", - ERROR + HIGHER_ACCESS_REQUIRED); + cprintf("%d Higher access required.\n", ERROR + HIGHER_ACCESS_REQUIRED); return; } @@ -462,12 +343,10 @@ void cmd_uimg(char *cmdbuf) CC->upload_fp = fopen(CC->upl_path, "wb"); if (CC->upload_fp == NULL) { - cprintf("%d Cannot open %s: %s\n", - ERROR + INTERNAL_ERROR, CC->upl_path, strerror(errno)); + cprintf("%d Cannot open %s: %s\n", ERROR + INTERNAL_ERROR, CC->upl_path, strerror(errno)); return; } cprintf("%d Ok\n", CIT_OK); - CC->upload_type = UPL_IMAGE; } @@ -476,26 +355,13 @@ void cmd_uimg(char *cmdbuf) */ void cmd_clos(char *cmdbuf) { - char buf[256]; - if (CC->download_fp == NULL) { - cprintf("%d You don't have a download file open.\n", - ERROR + RESOURCE_NOT_OPEN); + cprintf("%d You don't have a download file open.\n", ERROR + RESOURCE_NOT_OPEN); return; } fclose(CC->download_fp); CC->download_fp = NULL; - - if (CC->dl_is_net == 1) { - CC->dl_is_net = 0; - snprintf(buf, sizeof buf, - "%s/%s", - ctdl_netout_dir, - CC->net_node); - unlink(buf); - } - cprintf("%d Ok\n", CIT_OK); } @@ -513,15 +379,13 @@ void abort_upl(CitContext *who) } - /* * close the upload file */ void cmd_ucls(char *cmd) { FILE *fp; - char upload_notice[512]; - static int seq = 0; + char upload_notice[SIZ]; if (CC->upload_fp == NULL) { cprintf("%d You don't have an upload file open.\n", ERROR + RESOURCE_NOT_OPEN); @@ -531,38 +395,6 @@ void cmd_ucls(char *cmd) fclose(CC->upload_fp); CC->upload_fp = NULL; - if ((!strcasecmp(cmd, "1")) && (CC->upload_type != UPL_FILE)) { - cprintf("%d Upload completed.\n", CIT_OK); - - if (CC->upload_type == UPL_NET) { - char final_filename[PATH_MAX]; - snprintf(final_filename, sizeof final_filename, - "%s/%s.%04lx.%04x", - ctdl_netin_dir, - CC->net_node, - (long)getpid(), - ++seq - ); - - if (link(CC->upl_path, final_filename) == 0) { - syslog(LOG_INFO, "UCLS: updoaded %s\n", - final_filename); - unlink(CC->upl_path); - } - else { - syslog(LOG_ALERT, "Cannot link %s to %s: %s\n", - CC->upl_path, final_filename, strerror(errno) - ); - } - - - /* FIXME ... here we need to trigger a network run */ - } - - CC->upload_type = UPL_FILE; - return; - } - if (!strcasecmp(cmd, "1")) { cprintf("%d File '%s' saved.\n", CIT_OK, CC->upl_path); fp = fopen(CC->upl_filedir, "a"); @@ -570,20 +402,20 @@ void cmd_ucls(char *cmd) fp = fopen(CC->upl_filedir, "w"); } if (fp != NULL) { - fprintf(fp, "%s %s %s\n", CC->upl_file, - CC->upl_mimetype, - CC->upl_comment); + fprintf(fp, "%s %s %s\n", CC->upl_file, CC->upl_mimetype, CC->upl_comment); fclose(fp); } - /* put together an upload notice */ - snprintf(upload_notice, sizeof upload_notice, - "NEW UPLOAD: '%s'\n %s\n%s\n", - CC->upl_file, - CC->upl_comment, - CC->upl_mimetype); - quickie_message(CC->curr_user, NULL, NULL, CC->room.QRname, - upload_notice, 0, NULL); + if ((CC->room.QRflags2 & QR2_NOUPLMSG) == 0) { + /* put together an upload notice */ + snprintf(upload_notice, sizeof upload_notice, + "NEW UPLOAD: '%s'\n %s\n%s\n", + CC->upl_file, + CC->upl_comment, + CC->upl_mimetype + ); + quickie_message(CC->curr_user, NULL, NULL, CC->room.QRname, upload_notice, 0, NULL); + } } else { abort_upl(CC); cprintf("%d File '%s' aborted.\n", CIT_OK, CC->upl_path); @@ -610,8 +442,7 @@ void cmd_read(char *cmdbuf) } if (CC->download_fp == NULL) { - cprintf("%d You don't have a download file open.\n", - ERROR + RESOURCE_NOT_OPEN); + cprintf("%d You don't have a download file open.\n", ERROR + RESOURCE_NOT_OPEN); return; } @@ -622,11 +453,12 @@ void cmd_read(char *cmdbuf) rc = fseek(CC->download_fp, start_pos, 0); if (rc < 0) { - cprintf("%d your file is smaller then %ld.\n", ERROR + ILLEGAL_VALUE, start_pos); - syslog(LOG_ALERT, "your file %s is smaller then %ld. [%s]\n", - CC->upl_path, - start_pos, - strerror(errno)); + cprintf("%d your file is smaller than %ld.\n", ERROR + ILLEGAL_VALUE, start_pos); + syslog(LOG_ERR, "serv_file: your file %s is smaller than %ld [%s]", + CC->upl_path, + start_pos, + strerror(errno) + ); return; } @@ -647,6 +479,7 @@ void cmd_read(char *cmdbuf) */ void cmd_writ(char *cmdbuf) { + struct CitContext *CCC = CC; int bytes; char *buf; int rv; @@ -655,7 +488,7 @@ void cmd_writ(char *cmdbuf) bytes = extract_int(cmdbuf, 0); - if (CC->upload_fp == NULL) { + if (CCC->upload_fp == NULL) { cprintf("%d You don't have an upload file open.\n", ERROR + RESOURCE_NOT_OPEN); return; } @@ -671,134 +504,160 @@ void cmd_writ(char *cmdbuf) cprintf("%d %d\n", SEND_BINARY, bytes); buf = malloc(bytes + 1); client_read(buf, bytes); - rv = fwrite(buf, bytes, 1, CC->upload_fp); + rv = fwrite(buf, bytes, 1, CCC->upload_fp); if (rv == -1) { - syslog(LOG_EMERG, "Couldn't write: %s\n", - strerror(errno)); + syslog(LOG_ERR, "serv_file: %s", strerror(errno)); } free(buf); } - - -/* - * cmd_ndop() - open a network spool file for downloading - */ -void cmd_ndop(char *cmdbuf) +void files_logout_hook(void) { - char pathname[256]; - struct stat statbuf; + CitContext *CCC = MyContext(); - if (IsEmptyStr(CC->net_node)) { - cprintf("%d Not authenticated as a network node.\n", - ERROR + NOT_LOGGED_IN); - return; + /* + * If there is a download in progress, abort it. + */ + if (CCC->download_fp != NULL) { + fclose(CCC->download_fp); + CCC->download_fp = NULL; } - if (CC->download_fp != NULL) { - cprintf("%d You already have a download file open.\n", - ERROR + RESOURCE_BUSY); - return; + /* + * If there is an upload in progress, abort it. + */ + if (CCC->upload_fp != NULL) { + abort_upl(CCC); } - snprintf(pathname, sizeof pathname, - "%s/%s", - ctdl_netout_dir, - CC->net_node); +} - /* first open the file in append mode in order to create a - * zero-length file if it doesn't already exist - */ - CC->download_fp = fopen(pathname, "a"); - if (CC->download_fp != NULL) - fclose(CC->download_fp); - /* now open it */ - CC->download_fp = fopen(pathname, "r"); - if (CC->download_fp == NULL) { - cprintf("%d cannot open %s: %s\n", - ERROR + INTERNAL_ERROR, pathname, strerror(errno)); - return; +/* + * help_subst() - support routine for help file viewer + */ +void help_subst(char *strbuf, char *source, char *dest) +{ + char workbuf[SIZ]; + int p; + + while (p = pattern2(strbuf, source), (p >= 0)) { + strcpy(workbuf, &strbuf[p + strlen(source)]); + strcpy(&strbuf[p], dest); + strcat(strbuf, workbuf); } +} - /* set this flag so other routines know that the download file - * currently open is a network spool file - */ - CC->dl_is_net = 1; - - stat(pathname, &statbuf); - CC->download_fp_total = statbuf.st_size; - cprintf("%d %ld\n", CIT_OK, (long)statbuf.st_size); +void do_help_subst(char *buffer) +{ + char buf2[16]; + + help_subst(buffer, "^nodename", CtdlGetConfigStr("c_nodename")); + help_subst(buffer, "^humannode", CtdlGetConfigStr("c_humannode")); + help_subst(buffer, "^fqdn", CtdlGetConfigStr("c_fqdn")); + help_subst(buffer, "^username", CC->user.fullname); + snprintf(buf2, sizeof buf2, "%ld", CC->user.usernum); + help_subst(buffer, "^usernum", buf2); + help_subst(buffer, "^sysadm", CtdlGetConfigStr("c_sysadm")); + help_subst(buffer, "^variantname", CITADEL); + help_subst(buffer, "^maxsessions", CtdlGetConfigStr("c_maxsessions")); // yes it's numeric but str is ok here + help_subst(buffer, "^bbsdir", ctdl_message_dir); } + +typedef const char *ccharp; /* - * cmd_nuop() - open a network spool file for uploading + * display system messages or help */ -void cmd_nuop(char *cmdbuf) +void cmd_mesg(char *mname) { - static int seq = 1; - - if (IsEmptyStr(CC->net_node)) { - cprintf("%d Not authenticated as a network node.\n", - ERROR + NOT_LOGGED_IN); - return; - } - - if (CC->upload_fp != NULL) { - cprintf("%d You already have an upload file open.\n", - ERROR + RESOURCE_BUSY); + FILE *mfp; + char targ[256]; + char buf[256]; + char buf2[256]; + DIR *dp; + struct dirent *d; + + extract_token(buf, mname, 0, '|', sizeof buf); + + snprintf(buf2, sizeof buf2, "%s.%d.%d", buf, CC->cs_clientdev, CC->cs_clienttyp); + + /* If the client requested "?" then produce a listing */ + if (!strcmp(buf, "?")) { + cprintf("%d %s\n", LISTING_FOLLOWS, buf); + dp = opendir(ctdl_message_dir); + if (dp != NULL) { + while (d = readdir(dp), d != NULL) { + if (d->d_name[0] != '.') { + cprintf(" %s\n", d->d_name); + } + } + closedir(dp); + } + cprintf("000\n"); return; } - snprintf(CC->upl_path, sizeof CC->upl_path, - "%s/%s.%04lx.%04x", - ctdl_nettmp_dir, - CC->net_node, - (long)getpid(), - ++seq); - - CC->upload_fp = fopen(CC->upl_path, "r"); - if (CC->upload_fp != NULL) { - fclose(CC->upload_fp); - CC->upload_fp = NULL; - cprintf("%d '%s' already exists\n", - ERROR + ALREADY_EXISTS, CC->upl_path); + /* Otherwise, look for the requested file by name. */ + snprintf(targ, sizeof targ, "%s/%s", ctdl_message_dir, buf); + mfp = fopen(targ, "r"); + if (mfp==NULL) { + cprintf("%d Cannot open '%s': %s\n", + ERROR + FILE_NOT_FOUND, targ, strerror(errno)); return; } + cprintf("%d %s\n", LISTING_FOLLOWS, buf); - CC->upload_fp = fopen(CC->upl_path, "w"); - if (CC->upload_fp == NULL) { - cprintf("%d Cannot open %s: %s\n", - ERROR + INTERNAL_ERROR, CC->upl_path, strerror(errno)); - return; + while (fgets(buf, (sizeof buf - 1), mfp) != NULL) { + buf[strlen(buf)-1] = 0; + do_help_subst(buf); + cprintf("%s\n",buf); } - CC->upload_type = UPL_NET; - cprintf("%d Ok\n", CIT_OK); + fclose(mfp); + cprintf("000\n"); } -void files_logout_hook(void) + + +/* + * enter system messages or help + */ +void cmd_emsg(char *mname) { - CitContext *CCC = MyContext(); + FILE *mfp; + char targ[256]; + char buf[256]; + int a; - /* - * If there is a download in progress, abort it. - */ - if (CCC->download_fp != NULL) { - fclose(CCC->download_fp); - CCC->download_fp = NULL; + unbuffer_output(); + + if (CtdlAccessCheck(ac_aide)) return; + + extract_token(buf, mname, 0, '|', sizeof buf); + for (a=0; !IsEmptyStr(&buf[a]); ++a) { /* security measure */ + if (buf[a] == '/') buf[a] = '.'; } - /* - * If there is an upload in progress, abort it. - */ - if (CCC->upload_fp != NULL) { - abort_upl(CCC); + if (IsEmptyStr(targ)) { + snprintf(targ, sizeof targ, "%s/%s", ctdl_message_dir, buf); } -} + mfp = fopen(targ, "w"); + if (mfp==NULL) { + cprintf("%d Cannot open '%s': %s\n", + ERROR + INTERNAL_ERROR, targ, strerror(errno)); + return; + } + cprintf("%d %s\n", SEND_LISTING, targ); + while (client_getln(buf, sizeof buf) >=0 && strcmp(buf, "000")) { + fprintf(mfp, "%s\n", buf); + } + + fclose(mfp); +} /*****************************************************************************/ /* MODULE INITIALIZATION STUFF */ @@ -808,7 +667,6 @@ CTDL_MODULE_INIT(file_ops) { if (!threading) { CtdlRegisterSessionHook(files_logout_hook, EVT_LOGOUT, PRIO_LOGOUT + 8); - CtdlRegisterProtoHook(cmd_delf, "DELF", "Delete a file"); CtdlRegisterProtoHook(cmd_movf, "MOVF", "Move a file"); CtdlRegisterProtoHook(cmd_open, "OPEN", "Open a download file transfer"); @@ -817,10 +675,10 @@ CTDL_MODULE_INIT(file_ops) CtdlRegisterProtoHook(cmd_ucls, "UCLS", "Close an upload file transfer"); CtdlRegisterProtoHook(cmd_read, "READ", "File transfer read operation"); CtdlRegisterProtoHook(cmd_writ, "WRIT", "File transfer write operation"); - CtdlRegisterProtoHook(cmd_ndop, "NDOP", "Open a network spool file for download"); - CtdlRegisterProtoHook(cmd_nuop, "NUOP", "Open a network spool file for upload"); CtdlRegisterProtoHook(cmd_oimg, "OIMG", "Open an image file for download"); CtdlRegisterProtoHook(cmd_uimg, "UIMG", "Upload an image file"); + CtdlRegisterProtoHook(cmd_mesg, "MESG", "fetch system banners"); + CtdlRegisterProtoHook(cmd_emsg, "EMSG", "submit system banners"); } /* return our Subversion id for the Log */ return "file_ops";