+/* $Id$ */
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
+#include <limits.h>
#include <pthread.h>
#include "citadel.h"
#include "server.h"
-#include "proto.h"
+#include "config.h"
+#include "file_ops.h"
+#include "sysdep_decls.h"
+#include "user_ops.h"
+#include "support.h"
+#include "room_ops.h"
+#include "msgbase.h"
+#include "tools.h"
void cmd_delf(char *filename)
{
}
for (a=0; a<strlen(filename); ++a)
if (filename[a]=='/') filename[a] = '_';
- sprintf(pathname,"./files/%s/%s",CC->quickroom.QRdirname,filename);
+ snprintf(pathname,sizeof pathname,"./files/%s/%s",
+ CC->quickroom.QRdirname,filename);
a=unlink(pathname);
if (a==0) cprintf("%d File '%s' deleted.\n",OK,pathname);
else cprintf("%d File '%s' not found.\n",ERROR+FILE_NOT_FOUND,pathname);
char newpath[256];
char newroom[256];
char buf[256];
- FILE *fp;
int a;
- int target_room = (-1);
struct quickroom qrbuf;
extract(filename,cmdbuf,0);
for (a=0; a<strlen(filename); ++a)
if (filename[a]=='/') filename[a] = '_';
- sprintf(pathname,"./files/%s/%s",CC->quickroom.QRdirname,filename);
+ snprintf(pathname,sizeof pathname,"./files/%s/%s",
+ CC->quickroom.QRdirname,filename);
if (access(pathname,0)!=0) {
cprintf("%d File '%s' not found.\n",
ERROR+FILE_NOT_FOUND,pathname);
return;
}
- for (a=0; a<MAXROOMS; ++a) {
- getroom(&qrbuf,a);
- if (!strucmp(qrbuf.QRname,newroom)) target_room = a;
- }
- if (target_room < 0) {
- cprintf("%d Room '%s' not found.\n",
- ERROR+ROOM_NOT_FOUND,newroom);
+ if (getroom(&qrbuf, newroom)!=0) {
+ cprintf("%d '%s' does not exist.\n",
+ ERROR, newroom);
return;
}
- getroom(&qrbuf, target_room);
if ((qrbuf.QRflags & QR_DIRECTORY) == 0) {
cprintf("%d '%s' is not a directory room.\n",
ERROR+NOT_HERE,qrbuf.QRname);
return;
}
- sprintf(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,strerror(errno));
return;
unlink(pathname);
/* this is a crude method of copying the file description */
- sprintf(buf,"cat ./files/%s/filedir |grep %s >>./files/%s/filedir",
+ snprintf(buf, sizeof buf,
+ "cat ./files/%s/filedir |grep %s >>./files/%s/filedir",
CC->quickroom.QRdirname,
filename,
qrbuf.QRdirname);
{
char pathname[256],filename[256],destsys[256],buf[256],outfile[256];
int a,e;
- long now;
+ time_t now;
FILE *ofp;
extract(filename,cmdbuf,0);
for (a=0; a<strlen(filename); ++a)
if (filename[a]=='/') filename[a] = '_';
- sprintf(pathname,"./files/%s/%s",CC->quickroom.QRdirname,filename);
+ snprintf(pathname,sizeof pathname,"./files/%s/%s",
+ CC->quickroom.QRdirname,filename);
if (access(pathname,0)!=0) {
cprintf("%d File '%s' not found.\n",
ERROR+FILE_NOT_FOUND,pathname);
return;
}
- sprintf(buf,"sysop@%s",destsys);
+ snprintf(buf,sizeof buf,"sysop@%s",destsys);
e=alias(buf);
if (e!=M_BINARY) {
cprintf("%d No such system: '%s'\n",
ERROR+NO_SUCH_SYSTEM,destsys);
return;
}
- sprintf(outfile,"%s/network/spoolin/nsf.%d",BBSDIR,getpid());
+ snprintf(outfile,sizeof outfile,"%s/network/spoolin/nsf.%d",BBSDIR,
+ getpid());
ofp=fopen(outfile,"a");
if (ofp==NULL) {
cprintf("%d internal error\n",ERROR);
putc('M',ofp);
fclose(ofp);
- sprintf(buf,"cd ./files/%s; uuencode %s <%s 2>/dev/null >>%s",
+ snprintf(buf,sizeof buf,
+ "cd ./files/%s; uuencode %s <%s 2>/dev/null >>%s",
CC->quickroom.QRdirname,filename,filename,outfile);
system(buf);
fclose(ofp);
cprintf("%d File '%s' has been sent to %s.\n",OK,filename,destsys);
- system("nohup ./netproc >/dev/null 2>&1 &");
+ system("nohup ./netproc -i >/dev/null 2>&1 &");
return;
}
* It examines the file and displays the OK result code and some information
* about the file. NOTE: this stuff is Unix dependent.
*/
-void OpenCmdResult() {
+void OpenCmdResult(char *filename, char *mime_type) {
struct stat statbuf;
fstat(fileno(CC->download_fp), &statbuf);
- cprintf("%d %ld|%ld\n", OK, statbuf.st_size, statbuf.st_mtime);
+ cprintf("%d %ld|%ld|%s|%s\n", OK, statbuf.st_size, statbuf.st_mtime,
+ filename, mime_type);
}
for (a=0; a<strlen(filename); ++a)
if (filename[a]=='/') filename[a] = '_';
- sprintf(pathname,"./files/%s/%s",CC->quickroom.QRdirname,filename);
+ snprintf(pathname,sizeof pathname,
+ "./files/%s/%s",CC->quickroom.QRdirname,filename);
CC->download_fp = fopen(pathname,"r");
if (CC->download_fp==NULL) {
return;
}
- OpenCmdResult();
+ OpenCmdResult(filename, "application/octet-stream");
}
/*
return;
}
- if (!strucmp(filename, "_userpic_")) {
+ if (!strcasecmp(filename, "_userpic_")) {
extract(which_user, cmdbuf, 1);
if (getuser(&usbuf, which_user) != 0) {
cprintf("%d No such user.\n", ERROR+NO_SUCH_USER);
return;
}
- sprintf(pathname, "./userpics/%ld.gif", usbuf.usernum);
+ snprintf(pathname, sizeof pathname, "./userpics/%ld.gif",
+ usbuf.usernum);
}
- else if (!strucmp(filename, "_floorpic_")) {
+ else if (!strcasecmp(filename, "_floorpic_")) {
which_floor = extract_int(cmdbuf, 1);
- sprintf(pathname, "./images/floor.%d.gif", which_floor);
+ snprintf(pathname, sizeof pathname, "./images/floor.%d.gif",
+ which_floor);
}
- else if (!strucmp(filename, "_roompic_")) {
- sprintf(pathname, "./images/room.%d.gif", CC->curr_rm);
+ else if (!strcasecmp(filename, "_roompic_")) {
+ assoc_file_name(pathname, &CC->quickroom, "images");
}
else {
for (a=0; a<strlen(filename); ++a) {
filename[a] = tolower(filename[a]);
if (filename[a]=='/') filename[a] = '_';
}
- sprintf(pathname,"./images/%s.gif",filename);
+ snprintf(pathname,sizeof pathname,"./images/%s.gif",filename);
}
CC->download_fp = fopen(pathname,"r");
return;
}
- OpenCmdResult();
+ OpenCmdResult(pathname, "image/gif");
}
/*
for (a=0; a<strlen(CC->upl_file); ++a)
if (CC->upl_file[a]=='/') CC->upl_file[a] = '_';
- sprintf(CC->upl_path,"./files/%s/%s",CC->quickroom.QRdirname,CC->upl_file);
- sprintf(CC->upl_filedir,"./files/%s/filedir",CC->quickroom.QRdirname);
+ snprintf(CC->upl_path,sizeof CC->upl_path,"./files/%s/%s",
+ CC->quickroom.QRdirname,CC->upl_file);
+ snprintf(CC->upl_filedir,sizeof CC->upl_filedir,"./files/%s/filedir",
+ CC->quickroom.QRdirname);
CC->upload_fp = fopen(CC->upl_path,"r");
if (CC->upload_fp != NULL) {
}
if (CC->usersupp.axlevel >= 6) {
- sprintf(CC->upl_path, "./images/%s", basenm);
+ snprintf(CC->upl_path, sizeof CC->upl_path, "./images/%s",
+ basenm);
}
- if (!strucmp(basenm, "_userpic_")) {
- sprintf(CC->upl_path, "./userpics/%ld.gif",
- CC->usersupp.usernum);
+ if (!strcasecmp(basenm, "_userpic_")) {
+ snprintf(CC->upl_path, sizeof CC->upl_path,
+ "./userpics/%ld.gif", CC->usersupp.usernum);
}
- if ( (!strucmp(basenm, "_floorpic_")) && (CC->usersupp.axlevel >= 6) ) {
+ if ( (!strcasecmp(basenm, "_floorpic_")) && (CC->usersupp.axlevel >= 6) ) {
which_floor = extract_int(cmdbuf, 2);
- sprintf(CC->upl_path, "./images/floor.%d.gif", which_floor);
+ snprintf(CC->upl_path, sizeof CC->upl_path,
+ "./images/floor.%d.gif", which_floor);
}
- if ( (!strucmp(basenm, "_roompic_")) && (is_room_aide()) ) {
- sprintf(CC->upl_path, "./images/room.%d.gif", CC->curr_rm);
+ if ( (!strcasecmp(basenm, "_roompic_")) && (is_room_aide()) ) {
+ assoc_file_name(CC->upl_path, &CC->quickroom, "images");
}
if (strlen(CC->upl_path) == 0) {
if (CC->dl_is_net == 1) {
CC->dl_is_net = 0;
- sprintf(buf,"%s/network/spoolout/%s",BBSDIR,CC->net_node);
+ snprintf(buf,sizeof buf,"%s/network/spoolout/%s",BBSDIR,
+ CC->net_node);
unlink(buf);
}
void cmd_ucls(char *cmd)
{
FILE *fp;
- long now;
+ time_t now;
if (CC->upload_fp == NULL) {
cprintf("%d You don't have an upload file open.\n",ERROR);
fclose(CC->upload_fp);
CC->upload_fp = NULL;
- if ((!strucmp(cmd,"1")) && (CC->upload_type != UPL_FILE)) {
+ if ((!strcasecmp(cmd,"1")) && (CC->upload_type != UPL_FILE)) {
CC->upload_type = UPL_FILE;
cprintf("%d Upload completed.\n", OK);
return;
}
- if (!strucmp(cmd,"1")) {
+ if (!strcasecmp(cmd,"1")) {
cprintf("%d File '%s' saved.\n",OK,CC->upl_path);
fp = fopen(CC->upl_filedir,"a");
if (fp==NULL) fp=fopen(CC->upl_filedir,"w");
fprintf(fp,"NEW UPLOAD: '%s'\n %s\n",CC->upl_file,CC->upl_comment);
putc(0,fp);
fclose(fp);
- save_message(CC->temp, "", 0, M_LOCAL, 1);
+ save_message(CC->temp, "", "", M_LOCAL, 1);
}
else {
return;
}
- if (CC->dl_is_net) if (bytes>64) bytes = 64; /**** FIX ****/
-
fseek(CC->download_fp,start_pos,0);
fread(buf,bytes,1,CC->download_fp);
cprintf("%d %d\n",BINARY_FOLLOWS,bytes);
return;
}
- if (CC->upload_type==UPL_NET) if (bytes > 64) bytes = 64; /*** FIX ***/
-
cprintf("%d %d\n",SEND_BINARY,bytes);
client_read(buf, bytes);
fwrite(buf,bytes,1,CC->upload_fp);
char buf[256];
extract(buf,cmdbuf,1);
- if (strucmp(buf,config.c_net_password)) {
+ if (strcasecmp(buf,config.c_net_password)) {
cprintf("%d authentication failed\n",ERROR);
return;
}
return;
}
- sprintf(pathname,"%s/network/spoolout/%s",BBSDIR,CC->net_node);
+ snprintf(pathname,sizeof pathname,"%s/network/spoolout/%s",BBSDIR,
+ CC->net_node);
/* first open the file in append mode in order to create a
* zero-length file if it doesn't already exist
return;
}
- sprintf(CC->upl_path,"%s/network/spoolin/%s.%d",
+ snprintf(CC->upl_path,sizeof CC->upl_path,"%s/network/spoolin/%s.%d",
BBSDIR,CC->net_node,getpid());
CC->upload_fp = fopen(CC->upl_path,"r");