From: nethack.rankin Date: Sat, 15 Apr 2006 02:14:36 +0000 (+0000) Subject: omailcmd (trunk only) X-Git-Tag: MOVE2GIT~1063 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5501922aa882db606f925219734843112fb2f468;p=nethack omailcmd (trunk only) The revised newmail() wouldn't compile (Strncpy doesn't exist, `buf' was an array of pointers rather than of char). Simplify it substantially, and adjust the one caller (vms) that relied on the old convoluted bit. --- diff --git a/include/extern.h b/include/extern.h index 6e0ddc35e..f18a69b75 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1112,7 +1112,7 @@ E void FDECL(newomid, (struct obj *)); E void FDECL(free_omid, (struct obj *)); E void FDECL(newolong, (struct obj *)); E void FDECL(free_olong, (struct obj *)); -E void FDECL(new_omailcmd, (struct obj *,char *)); +E void FDECL(new_omailcmd, (struct obj *,const char *)); E void FDECL(free_omailcmd, (struct obj *)); E struct obj *FDECL(mkobj_at, (CHAR_P,int,int,BOOLEAN_P)); E struct obj *FDECL(mksobj_at, (int,int,int,BOOLEAN_P,BOOLEAN_P)); diff --git a/src/mail.c b/src/mail.c index 898339099..4916e46ef 100644 --- a/src/mail.c +++ b/src/mail.c @@ -379,25 +379,15 @@ struct mail_info *info; if (info->message_typ) { struct obj *obj = mksobj(SCR_MAIL, FALSE, FALSE); + + if (info->object_nam) + obj = oname(obj, info->object_nam); + if (info->response_cmd) + new_omailcmd(obj, info->response_cmd); + if (distu(md->mx,md->my) > 2) verbalize("Catch!"); display_nhwindow(WIN_MESSAGE, FALSE); - if (info->object_nam) { - char *buf[BUFSZ]; - Strncpy(buf, info->object_nam, BUFSZ - 1); - buf[BUFSZ - 1] = '\0'; - if (info->response_cmd) { /*(hide extension of the obj name)*/ - int namelth = info->response_cmd - info->object_nam - 1; - if ( namelth <= 0 ) - impossible("mail delivery screwed up"); - else { - *(buf + namelth) = '\0'; - obj = oname(obj, buf); - new_omailcmd(obj, info->response_cmd); - } - /* Note: renaming object won't discard the hidden cmd anymore. */ - } - } obj = hold_another_object(obj, "Oops!", (const char *)0, (const char *)0); } diff --git a/src/mkobj.c b/src/mkobj.c index b31d0afa3..f7268e51e 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -161,19 +161,16 @@ struct obj *otmp; } void -new_omailcmd(otmp,response_cmd) +new_omailcmd(otmp, response_cmd) struct obj *otmp; -char *response_cmd; +const char *response_cmd; { + unsigned lth = strlen(response_cmd) + 1; + if (!otmp->oextra) otmp->oextra = newoextra(); - if (!OMAILCMD(otmp)) { - unsigned lth = strlen(response_cmd) + 1; - OMAILCMD(otmp) = (char *)alloc(lth); - if (OMAILCMD(otmp)) { - (void) memset((genericptr_t)OMAILCMD(otmp), 0, lth); - Strcpy(OMAILCMD(otmp), response_cmd); - } - } + if (OMAILCMD(otmp)) free_omailcmd(otmp); + OMAILCMD(otmp) = (char *)alloc(lth); + Strcpy(OMAILCMD(otmp), response_cmd); } void @@ -360,9 +357,8 @@ struct obj *obj2, *obj1; (genericptr_t)OLONG(obj1), sizeof(long)); } - if (has_omailcmd(obj1)) { - if (!OMAILCMD(obj2)) new_omailcmd(obj2, OMAILCMD(obj1)); + new_omailcmd(obj2, OMAILCMD(obj1)); } } diff --git a/sys/vms/vmsmail.c b/sys/vms/vmsmail.c index 570503a1e..08acaa41f 100644 --- a/sys/vms/vmsmail.c +++ b/sys/vms/vmsmail.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)vmsmail.c 3.5 1995/06/01 */ +/* SCCS Id: @(#)vmsmail.c 3.5 2006/04/14 */ /* Copyright (c) Robert Patrick Rankin, 1991. */ /* NetHack may be freely redistributed. See license for details. */ @@ -59,16 +59,14 @@ static long pasteboard_id = 0; /* SMG's magic cookie */ * passed to newmail(). Routine newmail() generates a mail-daemon monster * who approaches the character, "speaks" the display text, and delivers * a scroll of mail pre-named to the object name; the response command is - * initially appended to the name, so that the object is tagged with both - * of them; a NUL is inserted to terminate the ordinary name and hide the - * command. (If the player renames such a scroll, the hidden command will - * be lost; who cares?) Unrecognized broadcasts result in the mail-daemon + * also attached to the scroll's oextra->omailcmd field. + * Unrecognized broadcasts result in the mail-daemon * arriving and announcing the display text, but no scroll being created. * If SHELL is undefined, then all broadcasts are treated as 'other'; since * no subproceses are allowed, there'd be no way to respond to the scroll. * * When a scroll of mail is read by the character, readmail() extracts - * the hidden command string and uses it for the default when prompting the + * the command string and uses it for the default when prompting the * player for a system command to spawn. The player may enter any command * he or she chooses, or just to accept the default or to * avoid executing any command. If the command is "SPAWN", a regular shell @@ -105,7 +103,8 @@ static long pasteboard_id = 0; /* SMG's magic cookie */ */ static struct mail_info msg; /* parse_*()'s return buffer */ -static char nam_cmd_buf[63], /* maximum onamelth, size of ONAME(object) */ +static char nam_buf[63], /* maximum onamelth, size of ONAME(object) */ + cmd_buf[99], /* arbitrary */ txt_buf[255+1]; /* same size as used for message buf[] */ /* try to decipher and categorize broadcast message text @@ -120,7 +119,7 @@ char *buf; /* input: filtered broadcast text */ # ifdef SHELL /* only parse if spawned commands are enabled */ register char *p, *q; boolean is_jnet_send; - char cmd_buf[127+1], user[127+1], node[127+1], sentinel; + char user[127+1], node[127+1], sentinel; /* Check these first; otherwise, their arbitrary text would enable easy spoofing of some other message patterns. Unfortunately, @@ -253,16 +252,15 @@ other: /* Daemon in newmail() will append period when the text is displayed */ if ((p = eos(txt)) > txt && *--p == '.') *p = '\0'; - /* newmail() and readmail() assume that nam and cmd are concatenated */ - if (nam) { /* object name to attach to scroll of mail */ - char *join = strcpy(nam_cmd_buf, nam); - if (cmd) { /* append command to name; readmail() requires it */ - int len = sizeof nam_cmd_buf - sizeof "" - (strlen(join) + 1); - cmd_buf[len] = '\0'; /* possibly truncate */ - (void) strcat(join, " "); - cmd = strcpy(eos(join), cmd); - } - nam = join; + /* newmail() and readmail() used to assume that nam and cmd are + concatenated but that is no longer the case */ + if (nam && nam != nam_buf) { + (void) strncpy(nam_buf, nam, sizeof nam_buf - 1); + nam_buf[sizeof nam_buf - 1] = '\0'; + } + if (cmd && cmd != cmd_buf) { + (void) strncpy(cmd_buf, cmd, sizeof cmd_buf - 1); + cmd_buf[sizeof cmd_buf - 1] = '\0'; } # endif /* SHELL */ /* truncate really long messages to prevent verbalize() from blowing up */