]> code.citadel.org Git - citadel.git/blobdiff - citadel/file_ops.c
* Fixed generation of unique file names for network uploads etc.
[citadel.git] / citadel / file_ops.c
index 17bc5dcda25a3f284229db96ab5b48728e350b14..fed2c0d890c4532137fa095958d8af768d1e0b3a 100644 (file)
@@ -1,4 +1,10 @@
-/* $Id$ */
+/* 
+ * $Id$
+ *
+ * Server functions which handle file transfers and room directories.
+ *
+ */
+
 #include "sysdep.h"
 #include <stdlib.h>
 #include <unistd.h>
@@ -10,9 +16,6 @@
 #include <sys/stat.h>
 #include <time.h>
 #include <limits.h>
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
 #include "citadel.h"
 #include "server.h"
 #include "config.h"
 #include "room_ops.h"
 #include "msgbase.h"
 #include "tools.h"
+#include "citserver.h"
 
 void cmd_delf(char *filename)
 {
        char pathname[64];
        int a;
 
-       if (!(CC->logged_in)) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (!is_room_aide()) {
-               cprintf("%d Higher access required.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
-
+       if (CtdlAccessCheck(ac_room_aide)) return;
 
        if ((CC->quickroom.QRflags & QR_DIRECTORY) == 0) {
                cprintf("%d No directory in this room.\n",ERROR+NOT_HERE);
@@ -79,16 +73,7 @@ void cmd_movf(char *cmdbuf)
        extract(filename,cmdbuf,0);
        extract(newroom,cmdbuf,1);
 
-       if (!(CC->logged_in)) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (!is_room_aide()) {
-               cprintf("%d Higher access required.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_room_aide)) return;
 
        if ((CC->quickroom.QRflags & QR_DIRECTORY) == 0) {
                cprintf("%d No directory in this room.\n",ERROR+NOT_HERE);
@@ -149,20 +134,12 @@ void cmd_netf(char *cmdbuf)
        int a,e;
        time_t now;
        FILE *ofp;
+       static int seq = 1;
 
        extract(filename,cmdbuf,0);
        extract(destsys,cmdbuf,1);
 
-       if (!(CC->logged_in)) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (!is_room_aide()) {
-               cprintf("%d Higher access required.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_room_aide)) return;
 
        if ((CC->quickroom.QRflags & QR_DIRECTORY) == 0) {
                cprintf("%d No directory in this room.\n",ERROR+NOT_HERE);
@@ -191,8 +168,9 @@ void cmd_netf(char *cmdbuf)
                        ERROR+NO_SUCH_SYSTEM,destsys);
                return;
                }
-       snprintf(outfile,sizeof outfile,"%s/network/spoolin/nsf.%d",BBSDIR,
-                getpid());
+       snprintf(outfile, sizeof outfile,
+               "%s/network/spoolin/nsf.%04x.%04x",
+               BBSDIR, getpid(), ++seq);
        ofp=fopen(outfile,"a");
        if (ofp==NULL) {
                cprintf("%d internal error\n",ERROR);
@@ -234,11 +212,16 @@ void cmd_netf(char *cmdbuf)
  */
 void OpenCmdResult(char *filename, char *mime_type) {
        struct stat statbuf;
+       time_t modtime;
+       long filesize;
 
        fstat(fileno(CC->download_fp), &statbuf);
-       cprintf("%d %ld|%ld|%s|%s\n", OK, statbuf.st_size, statbuf.st_mtime,
-                                       filename, mime_type);
-       }
+       filesize = (long) statbuf.st_size;
+       modtime = (time_t) statbuf.st_mtime;
+
+       cprintf("%d %ld|%ld|%s|%s\n",
+               OK, filesize, modtime, filename, mime_type);
+}
 
 
 /*
@@ -252,10 +235,7 @@ void cmd_open(char *cmdbuf)
 
        extract(filename,cmdbuf,0);
 
-       if (!(CC->logged_in)) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
+       if (CtdlAccessCheck(ac_logged_in)) return;
 
        if ((CC->quickroom.QRflags & QR_DIRECTORY) == 0) {
                cprintf("%d No directory in this room.\n",ERROR+NOT_HERE);
@@ -359,10 +339,7 @@ void cmd_uopn(char *cmdbuf)
        extract(CC->upl_file,cmdbuf,0);
        extract(CC->upl_comment,cmdbuf,1);
 
-       if (!(CC->logged_in)) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
+       if (CtdlAccessCheck(ac_logged_in)) return;
 
        if ((CC->quickroom.QRflags & QR_DIRECTORY) == 0) {
                cprintf("%d No directory in this room.\n",ERROR+NOT_HERE);
@@ -695,6 +672,8 @@ void cmd_ndop(char *cmdbuf)
  */
 void cmd_nuop(char *cmdbuf)
 {
+       static int seq = 1;
+
        if (strlen(CC->net_node)==0) {
                cprintf("%d Not authenticated as a network node.\n",
                        ERROR+NOT_LOGGED_IN);
@@ -706,8 +685,9 @@ void cmd_nuop(char *cmdbuf)
                return;
                }
 
-       snprintf(CC->upl_path,sizeof CC->upl_path,"%s/network/spoolin/%s.%d",
-               BBSDIR,CC->net_node,getpid());
+       snprintf(CC->upl_path, sizeof CC->upl_path,
+               "%s/network/spoolin/%s.%04x.%04x",
+               BBSDIR, CC->net_node, getpid(), ++seq);
 
        CC->upload_fp = fopen(CC->upl_path,"r");
        if (CC->upload_fp != NULL) {