📄 mailbox.c
字号:
/* Now say goodbye */
printf("Thank you %s, for calling the %s Tcp/Ip Mailbox.\n",m->name,
Hostname);
if(m->type == TIP)
printf("Please hang up now.\n");
return -2; /* signal that exitbbs() should be called */
}
static int
dombhelp(argc,argv,p)
int argc;
char *argv[];
void *p;
{
char buf[255];
int i;
FILE *fp;
if(*argv[0] == '?') {
fputs(Longmenu1,stdout);
fputs(Longmenu2,stdout);
fputs(Longmenu3,stdout);
return 0;
}
buf[0] = '\0';
if(argc > 1)
for(i=0; Mbcmds[i].name != NULL; ++i)
if(!strncmp(Mbcmds[i].name,argv[1],strlen(argv[1]))) {
sprintf(buf,"%s/%s.hlp",Helpdir,Mbcmds[i].name);
break;
}
if(buf[0] == '\0')
if(*argv[0] == 'i') /* INFO command */
sprintf(buf,"%s/info.hlp",Helpdir);
else
sprintf(buf,"%s/help.hlp",Helpdir);
if((fp = fopen(buf,READ_TEXT)) != NULL) {
sendfile(fp,Curproc->output,ASCII_TYPE,0);
fclose(fp);
}
else
printf("No help available. (%s not found)\n",buf);
return 0;
}
static int
dochat(argc,argv,p)
int argc;
char *argv[];
void *p;
{
char buf[8], *newargv[3];
if(Attended){
newargv[0] = "telnet";
newargv[1] = Hostname;
sprintf(buf,"%d",IPPORT_TTYLINK);
newargv[2] = buf;
return dombtelnet(3,newargv,p);
}
else {
printf("Sorry - the system is unattended.\007\n");
}
/* It returns only after a disconnect or refusal */
return 0;
}
static int
dosend(argc,argv,p)
int argc;
char *argv[];
void *p;
{
int cccnt = 0, fail = 0;
char *host, *cp, fullfrom[MBXLINE], sigwork[LINELEN], *rhdr = NULL;
struct list *ap, *cclist = NULL;
struct mbx *m;
FILE *fp;
m = (struct mbx *)p;
if((m->stype != 'R' || (m->sid & MBX_SID)) && mbx_to(argc,argv,m)
== -1){
if(m->sid & MBX_SID)
printf("NO - syntax error\n");
else {
printf("S command syntax error - format is:\n");
printf(" S[F] name [@ host] [< from_addr] [$bulletin_id]\n");
printf(" SR [number]\n");
}
return 0;
}
if(m->stype != 'R' && msgidcheck(m->tomsgid)) {
if(m->sid & MBX_SID)
fputs("NO - ",stdout);
printf("Already have %s\n",m->tomsgid);
return 0;
}
if(m->stype == 'R' && !(m->sid & MBX_SID) &&
mbx_reply(argc,argv,m,&cclist,&rhdr) == -1)
return 0;
if((cp = rewrite_address(m->to)) != NULL)
if(strcmp(m->to,cp) != 0){
m->origto = m->to;
m->to = cp;
}
else
free(cp);
if((m->origto != NULL || m->stype == 'R') && !(m->sid & MBX_SID))
printf("To: %s\n", m->to);
if(validate_address(m->to) == 0){
if(m->sid & MBX_SID)
printf("NO - bad address\n");
else
printf("Bad user or host name\n");
free(rhdr);
del_list(cclist);
/* We don't free any more buffers here. They are freed upon
* the next call to mbx_to() or to domboxbye()
*/
return 0;
}
/* Display the Cc: line (during SR command) */
for(ap = cclist; ap != NULL; ap = ap->next) {
if(cccnt == 0){
printf("%s",Hdrs[CC]);
cccnt = 4;
}
else {
fputs(", ",stdout);
cccnt += 2;
}
if(cccnt + strlen(ap->val) > 80 - 3) {
fputs("\n ",stdout);
cccnt = 4;
}
fputs(ap->val,stdout);
cccnt += strlen(ap->val);
}
if(cccnt)
putchar('\n');
m->state = MBX_SUBJ;
if(m->stype != 'R' || (m->sid & MBX_SID) != 0) {
printf((m->sid & MBX_SID) ? "OK\n" : "Subject: ");
if(mbxrecvline(m->user,m->line,MBXLINE,-1) == -1)
return 0;
}
else /* Replying to a message */
printf("Subject: %s\n",m->line);
if(mbx_data(m,cclist,rhdr) == -1){
free(rhdr);
del_list(cclist);
puts("Can't create temp file for mail");
return 0;
}
free(rhdr);
m->state = MBX_DATA;
if((m->sid & MBX_SID) == 0 && m->stype != 'F')
printf("Enter message. %s",Howtoend);
if(m->stype != 'F' || (m->sid & MBX_SID) != 0)
while(mbxrecvline(m->user,m->line,MBXLINE,-1) != -1){
if(m->line[0] == 0x01){ /* CTRL-A */
fclose(m->tfile);
puts("Aborted.");
del_list(cclist);
return 0;
}
if(m->line[0] != CTLZ && stricmp(m->line, "/ex"))
fprintf(m->tfile,"%s\n",m->line);
else
break; /* all done */
}
else {
fprintf(m->tfile,"----- Forwarded message -----\n\n");
msgtofile(m,m->current,m->tfile,0);
fprintf(m->tfile,"----- End of forwarded message -----\n");
}
/* Insert customised signature if one is found */
if(!(m->sid & MBX_SID)) { /* not a forwarding BBS */
sprintf(sigwork,"%s/%s.sig",Signature,
m->tofrom ? m->tofrom : m->name);
if((fp = fopen(sigwork,READ_TEXT)) != NULL){
while(fgets(sigwork,LINELEN,fp) != NULL)
fputs(sigwork,m->tfile);
fclose(fp);
}
}
if((host = strrchr(m->to,'@')) == NULL) {
host = Hostname; /* use our hostname */
if(m->origto != NULL) {
/* rewrite_address() will be called again by our
* SMTP server, so revert to the original address.
*/
free(m->to);
m->to = m->origto;
m->origto = NULL;
}
}
else
host++; /* use the host part of address */
/* make up full from name for work file */
if(m->tofrom != NULL)
sprintf(fullfrom,"%s%%%s.bbs@%s",m->tofrom, m->name, Hostname);
else
sprintf(fullfrom,"%s@%s",m->name,Hostname);
if(cclist != NULL && stricmp(host,Hostname) != 0) {
fseek(m->tfile,0L,0); /* reset to beginning */
fail = queuejob(m->tfile,Hostname,cclist,fullfrom);
del_list(cclist);
cclist = NULL;
}
addlist(&cclist,m->to,0);
fseek(m->tfile,0L,0);
fail += queuejob(m->tfile,host,cclist,fullfrom);
del_list(cclist);
fclose(m->tfile);
if(fail)
puts("Couldn't queue message for delivery");
else
if(m->tomsgid != NULL &&
(fp = fopen(Historyfile,APPEND_TEXT)) != NULL) {
fprintf(fp,"%s\n",m->tomsgid); /* Save BID in history file */
fclose(fp);
}
smtptick(0L); /* wake SMTP to send that mail */
return 0;
}
static int
dosid(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
char *cp;
m = (struct mbx *)p;
if(argc == 1)
return 1;
if(argv[1][strlen(argv[1]) - 1] != ']') /* must be an SID */
return 1;
m->sid = MBX_SID;
/* Now check to see if this is an RLI board.
* As usual, Hank does it a bit differently from
* the rest of the world.
*/
if(m->stype == 'R' && strncmp(argv[1],"li",2) == 0)/* [RLI] at a minimum */
m->sid |= MBX_RLI_SID;
/* Check to see if the BBS supports a kludge called "hierarchical
* routing designators."
*
* No need to check for ']' -- it must be there or this is not
* a valid mbox id -- it is checked earlier (fix de OH3LKU)
*/
if((cp = strchr(argv[1],'-')) != NULL
&& (cp=strchr(cp+1,'h')) != NULL
&& strchr(cp+1,'$'))
m->sid |= MBX_HIER_SID;
return 0;
}
int
dombescape(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
m = (struct mbx *)p;
if(argc < 2){
printf("The escape character is: ");
if(m->escape < 32)
printf("CTRL-%c\n",m->escape+'A'-1);
else
printf("'%c'\n",m->escape);
return 0;
}
if(strlen(argv[1]) > 1)
if(isdigit(*argv[1]))
m->escape = (char) atoi(argv[1]);
else
return 1;
else
m->escape = *argv[1];
return 0;
}
static int
dodownload(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
FILE *fp;
char *file;
m = (struct mbx *)p;
file = pathname(m->path,argv[1]);
if(!permcheck(m->path,m->privs,RETR_CMD,file)){
printf(Noperm);
return 0;
}
if((fp = fopen(file,READ_TEXT)) == NULL)
printf("Can't open \"%s\": %s\n",file,sys_errlist[errno]);
else
if(m->stype == 'U'){ /* uuencode ? */
fclose(fp);
fp = fopen(file,READ_BINARY); /* assume non-ascii */
uuencode(fp,m->user,file);
} else
sendfile(fp,m->user,ASCII_TYPE,0);
free(file);
fclose(fp);
return 0;
}
static int
dombupload(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
FILE *fp;
char *file, buf[LINELEN];
m = (struct mbx *)p;
file = pathname(m->path,argv[1]);
if(!permcheck(m->path,m->privs,STOR_CMD,file)){
printf(Noperm);
return 0;
}
if((fp = fopen(file,WRITE_TEXT)) == NULL){
printf("Can't create \"%s\": %s\n",file,sys_errlist[errno]);
free(file);
return 0;
}
logmsg(fileno(m->user),"MBOX upload: %s",file);
printf("Send file, %s",Howtoend);
for(;;){
if(mbxrecvline(m->user,buf,LINELEN,-1) == -1){
unlink(file);
break;
}
if(buf[0] == 0x01){ /* CTRL-A */
unlink(file);
printf("Aborted.\n");
break;
}
if(buf[0] == CTLZ || !stricmp("/ex",buf))
break;
fputs(buf,fp);
#if !defined(UNIX) && !defined(__TURBOC__) && !defined(AMIGA)
/* Needed only if the OS uses a CR/LF
* convention and putc doesn't do
* an automatic translation
*/
if(putc('\r',fp) == EOF)
break;
#endif
if(putc('\n',fp) == EOF)
break;
}
free(file);
fclose(fp);
return 0;
}
static int
dowhat(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
FILE *fp;
char *file;
m = (struct mbx *)p;
if(argc < 2)
file = strdup(m->path);
else
file = pathname(m->path,argv[1]);
if(!permcheck(m->path,m->privs,RETR_CMD,file)){
printf(Noperm);
return 0;
}
if((fp = dir(file,1)) == NULL)
printf("Can't read directory: \"%s\": %s\n",file,sys_errlist[errno]);
else
sendfile(fp,m->user,ASCII_TYPE,0);
free(file);
fclose(fp);
return 0;
}
static int
dozap(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
char *file;
m = (struct mbx *)p;
file = pathname(m->path,argv[1]);
if(!permcheck(m->path,m->privs,DELE_CMD,file)){
printf(Noperm);
return 0;
}
if(unlink(file))
printf("Zap failed: %s\n",sys_errlist[errno]);
logmsg(fileno(m->user),"MBOX Zap: %s",file);
free(file);
return 0;
}
static int
dosysop(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
int c;
extern struct cmds Cmds[];
m = (struct mbx *) p;
if(!(m->privs & SYSOP_CMD)){
printf(Noperm);
return 0;
}
dombescape(1,NULL,p);
for(;;){
printf("Net> ");
fflush(stdout);
c = mbxrecvline(stdin,m->line,MBXLINE,m->escape);
if(c == EOF || c == -2)
break;
logmsg(fileno(m->user),"MBOX sysop: %s",m->line);
cmdparse(Cmds,m->line,NULL);
}
return 0;
}
/* Handle the "*** Done" command when reverse forwarding ends or the
* "*** LINKED to" command.
*/
static int
dostars(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
int anony = 1;
m = (struct mbx *)p;
/* The "*** LINKED to" command is only allowed to stations with
* SYSOP privileges to prevent others from obtaining the same.
*/
if((m->privs & SYSOP_CMD) && argc == 4 && !strcmp(argv[1],"linked")) {
strcpy(m->name,argv[3]);
/* Try to find the privileges of this user from the userfile */
if((m->privs = userlogin(m->name,NULL,&m->path,MBXLINE,
&anony)) == -1)
if((m->privs = userlogin("bbs",NULL,&m->path,
MBXLINE,&anony)) == -1)
if((m->privs = userlogin("anonymous",NULL,
&m->path,MBXLINE,&anony)) == -1){
m->privs = 0;
free(m->path);
m->path = NULL;
}
printf("Oh, hello %s.\n",m->name);
if(m->privs & EXCLUDED_CMD)
return domboxbye(0,NULL,p);
changearea(m,m->name);
return 0;
}
if(argc > 1 && (m->sid & MBX_SID)) /* "*** Done" or similar */
return 2;
return -1;
}
static int
doarea(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
FILE *fp;
m = (struct mbx *) p;
if(argc < 2){
printf("Current message area is: %s\n",m->area);
printf("Available areas are:\n%-15s Your private mail area\n",
m->name);
if((fp = fopen(Arealist,READ_TEXT)) == NULL)
return 0;
sendfile(fp,m->user,ASCII_TYPE,0);
fclose(fp);
return 0;
}
if((m->privs & SYSOP_CMD) || strcmp(m->name,argv[1]) == 0){
changearea(m,argv[1]);
if(m->nmsgs){
if(!strcmp(m->name,m->area))
printf("You have ");
else
printf("%s: ",m->area);
printf("%d message%s - %d new.\n", m->nmsgs,
m->nmsgs == 1 ? " " : "s ", m->newmsgs);
}
return 0;
}
if(isarea(argv[1])) {
changearea(m,argv[1]);
printf("%s: %d message%s.\n", m->area, m->nmsgs,
m->nmsgs == 1 ? "" : "s");
}
else
printf("No such message area: %s\n",argv[1]);
return 0;
}
/* subroutine to do the actual switch from one area to another */
void
changearea(m,area)
struct mbx *m;
char *area;
{
closenotes(m);
m->nmsgs = m->newmsgs = m->current = 0;
strcpy(m->area,area);
scanmail(m);
}
static int
dombtelnet(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx *m;
int s, len, i;
struct sockaddr dsocket;
struct sockaddr_in fsocket;
m = (struct mbx *) p;
fsocket.sin_family = AF_INET;
if(argc < 3)
fsocket.sin_port = IPPORT_TELNET;
else
fsocket.sin_port = atoi(argv[2]);
if((fsocket.sin_addr.s_addr = resolve(argv[1])) == 0){
printf(Badhost,argv[1]);
return 0;
}
/* Only local telnets are are allowed to the unprivileged user */
if(!(m->privs & TELNET_CMD) && !ismyaddr(fsocket.sin_addr.s_addr)){
printf(Noperm);
return 0;
}
if((s = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf(Nosock);
return 0;
}
if(fsocket.sin_port == IPPORT_TTYLINK) {
m->startmsg = mallocw(80);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -