Newer
Older
if(!strcmp(sp,"MSG_FROM_NAME") && current_msg != nullptr) {
if(current_msg->hdr.attr&MSG_ANONYMOUS && !SYSOP)
return(text[Anonymous]);
*pmode |= (current_msg->hdr.auxattr & MSG_HFIELDS_UTF8);
return current_msg_from == nullptr ? current_msg->from : current_msg_from;
}
if(!strcmp(sp,"MSG_FROM_FIRST") && current_msg != nullptr) {
if(current_msg->hdr.attr&MSG_ANONYMOUS && !SYSOP)
safe_snprintf(str, maxlen, "%s", text[Anonymous]);
else
safe_snprintf(str, maxlen, "%s", current_msg_from == nullptr ? current_msg->from : current_msg_from);
if((tp = strchr(str, ' ')) != NULL)
*tp = '\0';
return str;
}
if(!strcmp(sp,"MSG_FROM_EXT") && current_msg!=NULL) {
if(!(current_msg->hdr.attr&MSG_ANONYMOUS) || SYSOP)
if(current_msg->from_ext!=NULL)
return(current_msg->from_ext);
return(nulstr);
if(!strcmp(sp,"MSG_FROM_NET") && current_msg!=NULL) {
if(current_msg->from_net.addr!=NULL
&& (!(current_msg->hdr.attr&MSG_ANONYMOUS) || SYSOP))
return(smb_netaddrstr(¤t_msg->from_net,str));
return(nulstr);
if(!strcmp(sp,"MSG_FROM_NETTYPE") && current_msg!=NULL) {
if(current_msg->from_net.type==NET_NONE)
return nulstr;
return(smb_nettype((enum smb_net_type)current_msg->from_net.type));
}
if(!strcmp(sp,"MSG_SUBJECT") && current_msg != nullptr) {
if(pmode != NULL)
*pmode |= (current_msg->hdr.auxattr & MSG_HFIELDS_UTF8);
return current_msg_subj == nullptr ? current_msg->subj : current_msg_subj;
}
if(!strcmp(sp,"MSG_SUMMARY") && current_msg!=NULL)
return(current_msg->summary==NULL ? nulstr : current_msg->summary);
if(!strcmp(sp,"MSG_TAGS") && current_msg!=NULL)
return(current_msg->tags==NULL ? nulstr : current_msg->tags);
if(!strcmp(sp,"MSG_DATE") && current_msg!=NULL)
return(timestr(smb_time(current_msg->hdr.when_written)));
if(!strcmp(sp,"MSG_DATE_UTC") && current_msg!=NULL)
return(timestr(smb_time(current_msg->hdr.when_written) - (smb_tzutc(current_msg->hdr.when_written.zone) * 60)));
if(!strcmp(sp,"MSG_IMP_DATE") && current_msg!=NULL)
return(timestr(current_msg->hdr.when_imported.time));
if(!strcmp(sp,"MSG_AGE") && current_msg!=NULL)
return age_of_posted_item(str, maxlen
,smb_time(current_msg->hdr.when_written) - (smb_tzutc(current_msg->hdr.when_written.zone) * 60));
if(!strcmp(sp,"MSG_TIMEZONE") && current_msg!=NULL)
return(smb_zonestr(current_msg->hdr.when_written.zone,NULL));
if(!strcmp(sp,"MSG_IMP_TIMEZONE") && current_msg!=NULL)
return(smb_zonestr(current_msg->hdr.when_imported.zone,NULL));
if(!strcmp(sp,"MSG_ATTR") && current_msg!=NULL) {
uint16_t attr = current_msg->hdr.attr;
uint16_t poll = attr&MSG_POLL_VOTE_MASK;
uint32_t auxattr = current_msg->hdr.auxattr;
/* Synchronized with show_msgattr(): */
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
,attr&MSG_READ ? "Read " :nulstr
,attr&MSG_DELETE ? "Deleted " :nulstr
,attr&MSG_KILLREAD ? "Kill " :nulstr
,attr&MSG_ANONYMOUS ? "Anonymous " :nulstr
,attr&MSG_LOCKED ? "Locked " :nulstr
,attr&MSG_PERMANENT ? "Permanent " :nulstr
,attr&MSG_MODERATED ? "Moderated " :nulstr
,attr&MSG_VALIDATED ? "Validated " :nulstr
,attr&MSG_REPLIED ? "Replied " :nulstr
,attr&MSG_NOREPLY ? "NoReply " :nulstr
,poll == MSG_POLL ? "Poll " :nulstr
,poll == MSG_POLL && auxattr&POLL_CLOSED ? "(Closed) " :nulstr
if(!strcmp(sp,"MSG_AUXATTR") && current_msg!=NULL) {
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s"
,current_msg->hdr.auxattr&MSG_FILEREQUEST ? "FileRequest " :nulstr
,current_msg->hdr.auxattr&MSG_FILEATTACH ? "FileAttach " :nulstr
,current_msg->hdr.auxattr&MSG_MIMEATTACH ? "MimeAttach " :nulstr
,current_msg->hdr.auxattr&MSG_KILLFILE ? "KillFile " :nulstr
,current_msg->hdr.auxattr&MSG_RECEIPTREQ ? "ReceiptReq " :nulstr
,current_msg->hdr.auxattr&MSG_CONFIRMREQ ? "ConfirmReq " :nulstr
,current_msg->hdr.auxattr&MSG_NODISP ? "DontDisplay " :nulstr
);
return(str);
}
if(!strcmp(sp,"MSG_NETATTR") && current_msg!=NULL) {
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s%s"
,current_msg->hdr.netattr&NETMSG_LOCAL ? "Local " :nulstr
,current_msg->hdr.netattr&NETMSG_INTRANSIT ? "InTransit " :nulstr
,current_msg->hdr.netattr&NETMSG_SENT ? "Sent " :nulstr
,current_msg->hdr.netattr&NETMSG_KILLSENT ? "KillSent " :nulstr
,current_msg->hdr.netattr&NETMSG_HOLD ? "Hold " :nulstr
,current_msg->hdr.netattr&NETMSG_CRASH ? "Crash " :nulstr
,current_msg->hdr.netattr&NETMSG_IMMEDIATE ? "Immediate " :nulstr
,current_msg->hdr.netattr&NETMSG_DIRECT ? "Direct " :nulstr
);
return(str);
}
if(!strcmp(sp,"MSG_ID") && current_msg!=NULL)
return(current_msg->id==NULL ? nulstr : current_msg->id);
if(!strcmp(sp,"MSG_REPLY_ID") && current_msg!=NULL)
return(current_msg->reply_id==NULL ? nulstr : current_msg->reply_id);
if(!strcmp(sp,"MSG_NUM") && current_msg!=NULL) {
safe_snprintf(str,maxlen,"%lu", (ulong)current_msg->hdr.number);
return(str);
}
if(!strcmp(sp,"MSG_SCORE") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%ld", (long)current_msg->upvotes - (long)current_msg->downvotes);
return(str);
}
if(!strcmp(sp,"MSG_UPVOTES") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->upvotes);
return(str);
}
if(!strcmp(sp,"MSG_DOWNVOTES") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->downvotes);
if(!strcmp(sp,"MSG_TOTAL_VOTES") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->total_votes);
if(!strcmp(sp,"MSG_VOTED"))
return (current_msg != NULL && current_msg->user_voted) ? text[PollAnswerChecked] : nulstr;
if(!strcmp(sp,"MSG_UPVOTED"))
return (current_msg != NULL && current_msg->user_voted == 1) ? text[PollAnswerChecked] : nulstr;
if(!strcmp(sp,"MSG_DOWNVOTED"))
return (current_msg != NULL && current_msg->user_voted == 2) ? text[PollAnswerChecked] : nulstr;
if(strcmp(sp, "MSG_THREAD_ID") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_id);
return str;
}
if(strcmp(sp, "MSG_THREAD_BACK") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_back);
return str;
}
if(strcmp(sp, "MSG_THREAD_NEXT") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_next);
return str;
}
if(strcmp(sp, "MSG_THREAD_FIRST") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_first);
return str;
}
safe_snprintf(str,maxlen,"%s %s"
,cfg.grp[cfg.sub[smb.subnum]->grp]->sname
,cfg.sub[smb.subnum]->sname);
else
strncpy(str, "Email", maxlen);
return(str);
}
if(!strcmp(sp,"SMB_AREA_DESC")) {
safe_snprintf(str,maxlen,"%s %s"
,cfg.grp[cfg.sub[smb.subnum]->grp]->lname
,cfg.sub[smb.subnum]->lname);
else
strncpy(str, "Personal Email", maxlen);
return(cfg.grp[cfg.sub[smb.subnum]->grp]->sname);
return(nulstr);
return(cfg.grp[cfg.sub[smb.subnum]->grp]->lname);
return(nulstr);
}
if(!strcmp(sp,"SMB_GROUP_NUM")) {
safe_snprintf(str,maxlen,"%u",getusrgrp(smb.subnum));
if(smb.subnum==INVALID_SUB)
return(cfg.sub[smb.subnum]->sname);
return(nulstr);
if(smb.subnum==INVALID_SUB)
return(cfg.sub[smb.subnum]->lname);
return(nulstr);
if(smb.subnum==INVALID_SUB)
return(cfg.sub[smb.subnum]->code);
return(nulstr);
safe_snprintf(str,maxlen,"%u",getusrsub(smb.subnum));
if(!strcmp(sp,"SMB_MSGS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.msgs);
return(str);
}
if(!strcmp(sp,"SMB_CURMSG")) {
safe_snprintf(str,maxlen,"%lu", (ulong)(smb.curmsg+1));
return(str);
}
if(!strcmp(sp,"SMB_LAST_MSG")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.last_msg);
return(str);
}
if(!strcmp(sp,"SMB_MAX_MSGS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.max_msgs);
return(str);
}
if(!strcmp(sp,"SMB_MAX_CRCS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.max_crcs);
return(str);
}
if(!strcmp(sp,"SMB_MAX_AGE")) {
safe_snprintf(str,maxlen,"%hu",smb.status.max_age);
return(str);
}
if(!strcmp(sp,"SMB_TOTAL_MSGS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.total_msgs);
return(str);
}
/* Currently viewed file */
if(current_file != NULL) {
if(is_valid_dirnum(current_file->dir)) {
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
if(strcmp(sp, "FILE_AREA") == 0) {
safe_snprintf(str, maxlen, "%s %s"
,cfg.lib[cfg.dir[current_file->dir]->lib]->sname
,cfg.dir[current_file->dir]->sname);
return str;
}
if(strcmp(sp, "FILE_AREA_DESC") == 0) {
safe_snprintf(str, maxlen, "%s %s"
,cfg.lib[cfg.dir[current_file->dir]->lib]->lname
,cfg.dir[current_file->dir]->lname);
return str;
}
if(strcmp(sp, "FILE_LIB") == 0)
return cfg.lib[cfg.dir[current_file->dir]->lib]->sname;
if(strcmp(sp, "FILE_LIB_DESC") == 0)
return cfg.lib[cfg.dir[current_file->dir]->lib]->lname;
if(strcmp(sp, "FILE_LIB_NUM") == 0) {
safe_snprintf(str, maxlen, "%u", getusrlib(current_file->dir));
return str;
}
if(strcmp(sp, "FILE_DIR") == 0)
return cfg.dir[current_file->dir]->sname;
if(strcmp(sp, "FILE_DIR_DESC") == 0)
return cfg.dir[current_file->dir]->lname;
if(strcmp(sp, "FILE_DIR_CODE") == 0)
return cfg.dir[current_file->dir]->code;
if(strcmp(sp, "FILE_DIR_NUM") == 0) {
safe_snprintf(str, maxlen, "%u", getusrdir(current_file->dir));
return str;
}
if(strcmp(sp, "FILE_FTP_PATH") == 0) {
getfilevpath(&cfg, current_file, str, maxlen);
return str;
}
if(strcmp(sp, "FILE_WEB_PATH") == 0) {
char* p = "";
if(cfg.dir[current_file->dir]->vpath[0] == '\0') {
p = startup->web_file_vpath_prefix;
if(*p == '/')
++p;
}
safe_snprintf(str, maxlen, "%s%s", p, getfilevpath(&cfg, current_file, tmp, sizeof tmp));
return str;
}
}
if(strcmp(sp, "FILE_NAME") == 0)
return current_file->name;
if(strcmp(sp, "FILE_DESC") == 0)
return current_file->desc;
if(strcmp(sp, "FILE_TAGS") == 0)
return current_file->tags;
if(strcmp(sp, "FILE_UPLOADER") == 0)
return current_file->from;
if(strcmp(sp, "FILE_SIZE") == 0) {
safe_snprintf(str, maxlen, "%ld", (long)current_file->size);
return str;
}
if(strcmp(sp, "FILE_CREDITS") == 0) {
safe_snprintf(str, maxlen, "%" PRIu64, current_file->cost);
return str;
}
if(strcmp(sp, "FILE_TIME") == 0)
return timestr(current_file->time);
if(strcmp(sp, "FILE_TIME_ULED") == 0)
return timestr(current_file->hdr.when_imported.time);
if(strcmp(sp, "FILE_TIME_DLED") == 0)
return timestr(current_file->hdr.last_downloaded);
return datestr(current_file->time);
if(strcmp(sp, "FILE_DATE_ULED") == 0)
return datestr(current_file->hdr.when_imported.time);
if(strcmp(sp, "FILE_DATE_DLED") == 0)
return datestr(current_file->hdr.last_downloaded);
if(strcmp(sp, "FILE_TIMES_DLED") == 0) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_file->hdr.times_downloaded);
return get_text(sp);

Rob Swindell
committed
char* sbbs_t::expand_atcodes(const char* src, char* buf, size_t size, const smbmsg_t* msg)

Rob Swindell
committed
{
char* dst = buf;
char* end = dst + (size - 1);
const smbmsg_t* saved_msg{current_msg};

Rob Swindell
committed
if (msg != NULL)
current_msg = msg;

Rob Swindell
committed
while (*src != '\0' && dst < end) {
if (*src == '@') {
char str[32];
SAFECOPY(str, src + 1);
char* at = strchr(str, '@');
const char* sp = strchr(str, ' ');
if (at != NULL && (sp == NULL || sp > at)) {
char tmp[128];
*at = '\0';
src += strlen(str) + 2;
const char* p = formatted_atcode(str, tmp, sizeof tmp);
if(p != NULL)
dst += strlcpy(dst, p, end - dst);

Rob Swindell
committed
continue;
}
}
*(dst++) = *(src++);
}
if(dst > end)
dst = end;

Rob Swindell
committed
*dst = '\0';
current_msg = saved_msg;

Rob Swindell
committed
return buf;
}