/*
* Server functions which handle file transfers and room directories.
*
- * Copyright (c) 1987-2017 by the citadel.org team
+ * 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.
* GNU General Public License for more details.
*/
+#include <stdlib.h>
+#include <unistd.h>
#include <stdio.h>
+#include <netdb.h>
#include <libcitadel.h>
#include <dirent.h>
-
+#include <sys/types.h>
+#include <sys/stat.h>
#include "ctdl_module.h"
#include "citserver.h"
#include "support.h"
return;
}
cprintf("%d Ok\n", CIT_OK);
- CC->upload_type = UPL_IMAGE;
}
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);
}
fclose(CC->upload_fp);
CCC->upload_fp = NULL;
- if ((!strcasecmp(cmd, "1")) && (CCC->upload_type != UPL_FILE)) {
- cprintf("%d Upload completed.\n", CIT_OK);
-
- if (CCC->upload_type == UPL_NET) {
- char final_filename[PATH_MAX];
- snprintf(final_filename, sizeof final_filename, "%s/%s.%04lx.%04x", ctdl_netin_dir, CCC->net_node, (long)getpid(), ++seq);
-
- if (link(CCC->upl_path, final_filename) == 0) {
- syslog(LOG_INFO, "UCLS: updoaded %s", final_filename);
- unlink(CCC->upl_path);
- }
- else {
- syslog(LOG_INFO, "Cannot link %s to %s: %s",
- CCC->upl_path, final_filename, strerror(errno)
- );
- }
- }
-
- CCC->upload_type = UPL_FILE;
- return;
- }
-
if (!strcasecmp(cmd, "1")) {
cprintf("%d File '%s' saved.\n", CIT_OK, CCC->upl_path);
fp = fopen(CCC->upl_filedir, "a");
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_ERR, "your file %s is smaller then %ld. [%s]",
- 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;
client_read(buf, bytes);
rv = fwrite(buf, bytes, 1, CCC->upload_fp);
if (rv == -1) {
- syslog(LOG_EMERG, "Couldn't write: %s", 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)
-{
- struct CitContext *CCC = CC;
- char pathname[256];
- struct stat statbuf;
-
- if (IsEmptyStr(CCC->net_node)) {
- cprintf("%d Not authenticated as a network node.\n",
- ERROR + NOT_LOGGED_IN);
- return;
- }
-
- if (CCC->download_fp != NULL) {
- cprintf("%d You already have a download file open.\n",
- ERROR + RESOURCE_BUSY);
- return;
- }
-
- snprintf(pathname, sizeof pathname,
- "%s/%s",
- ctdl_netout_dir,
- CCC->net_node);
-
- /* first open the file in append mode in order to create a
- * zero-length file if it doesn't already exist
- */
- CCC->download_fp = fopen(pathname, "a");
- if (CCC->download_fp != NULL)
- fclose(CCC->download_fp);
-
- /* now open it */
- CCC->download_fp = fopen(pathname, "r");
- if (CCC->download_fp == NULL) {
- cprintf("%d cannot open %s: %s\n",
- ERROR + INTERNAL_ERROR, pathname, strerror(errno));
- return;
- }
-
-
- /* set this flag so other routines know that the download file
- * currently open is a network spool file
- */
- CCC->dl_is_net = 1;
-
- stat(pathname, &statbuf);
- CCC->download_fp_total = statbuf.st_size;
- cprintf("%d %ld\n", CIT_OK, (long)statbuf.st_size);
-}
-
-
-/*
- * cmd_nuop() - open a network spool file for uploading
- */
-void cmd_nuop(char *cmdbuf)
-{
- 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);
- 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);
- return;
- }
-
- 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;
- }
-
- CC->upload_type = UPL_NET;
- cprintf("%d Ok\n", CIT_OK);
-}
-
-
void files_logout_hook(void)
{
CitContext *CCC = MyContext();
ERROR + FILE_NOT_FOUND, targ, strerror(errno));
return;
}
- cprintf("%d %s\n", LISTING_FOLLOWS,buf);
+ cprintf("%d %s\n", LISTING_FOLLOWS, buf);
while (fgets(buf, (sizeof buf - 1), mfp) != NULL) {
buf[strlen(buf)-1] = 0;
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");