10 #include <sys/types.h>
19 char floorlist[128][256];
26 struct march *march = NULL;
29 * load the list of floors
31 void load_floorlist(void) {
35 for (a=0; a<128; ++a) floorlist[a][0] = 0;
40 strcpy(floorlist[0],"Main Floor");
43 while (serv_gets(buf), strcmp(buf,"000")) {
44 extract(floorlist[extract_int(buf,0)],buf,1);
50 * remove a room from the march list
52 void remove_march(char *aaa)
54 struct march *mptr,*mptr2;
56 if (march==NULL) return;
58 if (!strcasecmp(march->march_name,aaa)) {
66 for (mptr=march; mptr!=NULL; mptr=mptr->next) {
67 if (!strcasecmp(mptr->march_name,aaa)) {
68 mptr2->next = mptr->next;
79 void listrms(char *variety)
85 fprintf(stderr, "doing listrms(%s)\n", variety);
88 if (buf[0]!='1') return;
89 while (serv_gets(buf), strcmp(buf,"000")) {
90 extract(rmname,buf,0);
91 wprintf("<A HREF=\"/dotgoto&room=");
93 wprintf("\" TARGET=\"top\">");
95 f = extract_int(buf,1);
96 if ((f & QR_DIRECTORY) && (f & QR_NETWORK)) wprintf("}");
97 else if (f & QR_DIRECTORY) wprintf("]");
98 else if (f & QR_NETWORK) wprintf(")");
101 wprintf("</A><TT> </TT>\n");
109 * list all rooms by floor
111 void list_all_rooms_by_floor(void) {
117 printf("HTTP/1.0 200 OK\n");
120 wprintf("<TABLE width=100% border><TR><TH>Floor</TH>");
121 wprintf("<TH>Rooms with new messages</TH>");
122 wprintf("<TH>Rooms with no new messages</TH></TR>\n");
124 for (a=0; a<128; ++a) if (floorlist[a][0]!=0) {
126 /* Floor name column */
129 serv_printf("OIMG _floorpic_|%d", a);
134 wprintf("<IMG SRC=\"/image&name=_floorpic_&parm=%d\" ALT=\"%s\">",
135 a, &floorlist[a][0]);
138 escputs(&floorlist[a][0]);
143 /* Rooms with new messages column */
145 sprintf(buf,"LKRN %d",a);
147 wprintf("</TD><TD>\n");
149 /* Rooms with old messages column */
150 sprintf(buf,"LKRO %d",a);
152 wprintf("</TD></TR>\n");
154 wprintf("</TABLE>\n");
155 wprintf("</BODY></HTML>\n");
161 * list all forgotten rooms
163 void zapped_list(void) {
164 printf("HTTP/1.0 200 OK\n");
166 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
167 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
168 wprintf("<B>Zapped (forgotten) rooms</B>\n");
169 wprintf("</FONT></TD></TR></TABLE><BR>\n");
171 wprintf("<BR><BR>\n");
172 wprintf("Click on any room to un-zap it and goto that room.\n");
173 wprintf("</BODY></HTML>\n");
179 * read this room's info file (set v to 1 for verbose mode)
187 if (buf[0]=='1') fmout(NULL);
189 if (v==1) wprintf("<EM>%s</EM><BR>\n",&buf[4]);
195 * generic routine to take the session to a new room
197 * display_name values: 0 = goto only
198 * 1 = goto and display
201 void gotoroom(char *gname, int display_name)
204 static long ls = (-1L);
208 printf("HTTP/1.0 200 OK\n");
209 printf("Window-target: top\n");
211 wprintf("<HTML><HEAD></HEAD>\n<BODY ");
213 /* automatically fire up a read-new-msgs in the bottom frame */
214 wprintf("onload=location=\"/readnew\" ");
216 wprintf("BACKGROUND=\"/image&name=background\" TEXT=\"#000000\" LINK=\"#004400\">\n");
219 if (display_name != 2) {
220 /* store ungoto information */
221 strcpy(ugname, wc_roomname);
225 /* move to the new room */
226 serv_printf("GOTO %s", gname);
229 serv_puts("GOTO _BASEROOM_");
234 wprintf("<EM>%s</EM><BR></BODY></HTML>\n",&buf[4]);
240 extract(wc_roomname,&buf[4],0);
241 room_flags = extract_int(&buf[4],4);
242 /* highest_msg_read = extract_int(&buf[4],6);
243 maxmsgnum = extract_int(&buf[4],5);
244 is_mail = (char) extract_int(&buf[4],7); */
245 ls = extract_long(&buf[4], 6);
247 if (is_aide) is_room_aide = is_aide;
248 else is_room_aide = (char) extract_int(&buf[4],8);
250 remove_march(wc_roomname);
251 if (!strcasecmp(gname,"_BASEROOM_")) remove_march(gname);
253 /* Display the room banner */
255 wprintf("<CENTER><TABLE border=0><TR>");
257 if ( (strlen(ugname)>0) && (strcasecmp(ugname,wc_roomname)) ) {
258 wprintf("<TD><A HREF=\"/ungoto\">");
259 wprintf("<IMG SRC=\"/static/back.gif\" border=0></A></TD>");
262 wprintf("<TD><H1>%s</H1>",wc_roomname);
263 wprintf("<FONT SIZE=-1>%d new of %d messages</FONT></TD>\n",
264 extract_int(&buf[4],1),
265 extract_int(&buf[4],2));
267 /* Display room graphic. The server doesn't actually
268 * need the room name, but we supply it in order to
269 * keep the browser from using a cached graphic from
272 serv_puts("OIMG _roompic_");
276 wprintf("<IMG SRC=\"/image&name=_roompic_&room=");
277 escputs(wc_roomname);
287 wprintf("<TD><A HREF=\"/gotonext\">");
288 wprintf("<IMG SRC=\"/static/forward.gif\" border=0></A></TD>");
289 wprintf("</TR></TABLE></CENTER>\n");
290 wprintf("</BODY></HTML>\n");
294 strcpy(wc_roomname, wc_roomname);
299 /* Goto next room having unread messages.
300 * We want to skip over rooms that the user has already been to, and take the
301 * user back to the lobby when done. The room we end up in is placed in
302 * newroom - which is set to 0 (the lobby) initially.
303 * We start the search in the current room rather than the beginning to prevent
304 * two or more concurrent users from dragging each other back to the same room.
306 void gotonext(void) {
308 struct march *mptr,*mptr2;
311 /* First check to see if the march-mode list is already allocated.
312 * If it is, pop the first room off the list and go there.
319 while (serv_gets(buf), strcmp(buf,"000")) {
320 mptr = (struct march *) malloc(sizeof(struct march));
322 extract(mptr->march_name,buf,0);
328 while (mptr2->next != NULL)
334 /* add _BASEROOM_ to the end of the march list, so the user will end up
335 * in the system base room (usually the Lobby>) at the end of the loop
337 mptr = (struct march *) malloc(sizeof(struct march));
339 strcpy(mptr->march_name,"_BASEROOM_");
345 while (mptr2->next != NULL)
350 * ...and remove the room we're currently in, so a <G>oto doesn't make us
351 * walk around in circles
353 remove_march(wc_roomname);
358 strcpy(next_room,march->march_name);
361 strcpy(next_room,"_BASEROOM_");
363 gotoroom(next_room,1);
369 * mark all messages in current room as having been read
371 void slrp_highest(void) {
375 serv_puts("SLRP HIGHEST");
378 wprintf("<EM>%s</EM><BR>\n",&buf[4]);
385 * un-goto the previous room
390 if (!strcmp(ugname, "")) {
391 gotoroom(wc_roomname, 1);
394 serv_printf("GOTO %s", ugname);
397 gotoroom(wc_roomname, 1);
401 serv_printf("SLRP %ld",uglsn);
410 * display the form for editing a room
412 void display_editroom(void) {
415 char er_password[10];
417 char er_roomaide[26];
424 display_error(&buf[4]);
428 extract(er_name,&buf[4],0);
429 extract(er_password,&buf[4],1);
430 extract(er_dirname,&buf[4],2);
431 er_flags=extract_int(&buf[4],3);
434 printf("HTTP/1.0 200 OK\n");
437 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=000077><TR><TD>");
438 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
439 wprintf("<B>Edit this room</B>\n");
440 wprintf("</FONT></TD></TR></TABLE>\n");
442 wprintf("<FORM METHOD=\"POST\" ACTION=\"/editroom\">\n");
444 wprintf("<UL><LI>Name of room: ");
445 wprintf("<INPUT TYPE=\"text\" NAME=\"er_name\" VALUE=\"%s\" MAXLENGTH=\"19\">\n",er_name);
447 wprintf("<LI>Type of room:<UL>\n");
449 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"public\" ");
450 if ((er_flags & QR_PRIVATE) == 0) wprintf("CHECKED ");
451 wprintf("> Public room\n");
453 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"guessname\" ");
454 if ((er_flags & QR_PRIVATE)&&
455 (er_flags & QR_GUESSNAME)) wprintf("CHECKED ");
456 wprintf("> Private - guess name\n");
458 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"passworded\" ");
459 if ((er_flags & QR_PRIVATE)&&
460 (er_flags & QR_PASSWORDED)) wprintf("CHECKED ");
461 wprintf("> Private - require password:\n");
462 wprintf("<INPUT TYPE=\"text\" NAME=\"er_password\" VALUE=\"%s\" MAXLENGTH=\"9\">\n",er_password);
464 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"invonly\" ");
465 if ( (er_flags & QR_PRIVATE)
466 && ((er_flags & QR_GUESSNAME) == 0)
467 && ((er_flags & QR_PASSWORDED) == 0) )
469 wprintf("> Private - invitation only\n");
471 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"bump\" VALUE=\"yes\" ");
472 wprintf("> If private, cause current users to forget room\n");
476 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"prefonly\" VALUE=\"yes\" ");
477 if (er_flags & QR_PREFONLY) wprintf("CHECKED ");
478 wprintf("> Preferred users only\n");
480 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"readonly\" VALUE=\"yes\" ");
481 if (er_flags & QR_READONLY) wprintf("CHECKED ");
482 wprintf("> Read-only room\n");
484 /* directory stuff */
485 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"directory\" VALUE=\"yes\" ");
486 if (er_flags & QR_DIRECTORY) wprintf("CHECKED ");
487 wprintf("> File directory room\n");
489 wprintf("<UL><LI>Directory name: ");
490 wprintf("<INPUT TYPE=\"text\" NAME=\"er_dirname\" VALUE=\"%s\" MAXLENGTH=\"14\">\n",er_dirname);
492 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"ulallowed\" VALUE=\"yes\" ");
493 if (er_flags & QR_UPLOAD) wprintf("CHECKED ");
494 wprintf("> Uploading allowed\n");
496 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"dlallowed\" VALUE=\"yes\" ");
497 if (er_flags & QR_DOWNLOAD) wprintf("CHECKED ");
498 wprintf("> Downloading allowed\n");
500 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"visdir\" VALUE=\"yes\" ");
501 if (er_flags & QR_VISDIR) wprintf("CHECKED ");
502 wprintf("> Visible directory</UL>\n");
504 /* end of directory stuff */
506 wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"network\" VALUE=\"yes\" ");
507 if (er_flags & QR_NETWORK) wprintf("CHECKED ");
508 wprintf("> Network shared room\n");
510 /* start of anon options */
512 wprintf("<LI>Anonymous messages<UL>\n");
514 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"anon\" VALUE=\"no\" ");
515 if ( ((er_flags & QR_ANONONLY)==0)
516 && ((er_flags & QR_ANONOPT)==0)) wprintf("CHECKED ");
517 wprintf("> No anonymous messages\n");
519 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"anon\" VALUE=\"anononly\" ");
520 if (er_flags & QR_ANONONLY) wprintf("CHECKED ");
521 wprintf("> All messages are anonymous\n");
523 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"anon\" VALUE=\"anon2\" ");
524 if (er_flags & QR_ANONOPT) wprintf("CHECKED ");
525 wprintf("> Prompt user when entering messages</UL>\n");
527 /* end of anon options */
529 wprintf("<LI>Room aide: \n");
533 wprintf("<EM>%s</EM>\n",&buf[4]);
536 extract(er_roomaide,&buf[4],0);
537 wprintf("<INPUT TYPE=\"text\" NAME=\"er_roomaide\" VALUE=\"%s\" MAXLENGTH=\"25\">\n",er_roomaide);
540 wprintf("</UL><CENTER>\n");
541 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
542 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
543 wprintf("</CENTER>\n");
545 wprintf("</FORM></HTML>\n");
551 * save new parameters for a room
553 void editroom(void) {
556 char er_password[10];
558 char er_roomaide[26];
563 if (strcmp(bstr("sc"),"OK")) {
564 display_error("Cancelled. Changes were not saved.");
572 display_error(&buf[4]);
576 extract(er_name,&buf[4],0);
577 extract(er_password,&buf[4],1);
578 extract(er_dirname,&buf[4],2);
579 er_flags=extract_int(&buf[4],3);
581 strcpy(er_roomaide,bstr("er_roomaide"));
582 if (strlen(er_roomaide)==0) {
586 strcpy(er_roomaide,"");
589 extract(er_roomaide,&buf[4],0);
593 strcpy(buf,bstr("er_name")); buf[20] = 0;
594 if (strlen(buf)>0) strcpy(er_name,buf);
596 strcpy(buf,bstr("er_password")); buf[10] = 0;
597 if (strlen(buf)>0) strcpy(er_password,buf);
599 strcpy(buf,bstr("er_dirname")); buf[15] = 0;
600 if (strlen(buf)>0) strcpy(er_dirname,buf);
602 strcpy(buf,bstr("type"));
603 er_flags &= !(QR_PRIVATE|QR_PASSWORDED|QR_GUESSNAME);
605 if (!strcmp(buf,"invonly")) {
606 er_flags |= (QR_PRIVATE);
608 if (!strcmp(buf,"guessname")) {
609 er_flags |= (QR_PRIVATE | QR_GUESSNAME);
611 if (!strcmp(buf,"passworded")) {
612 er_flags |= (QR_PRIVATE | QR_PASSWORDED);
615 if (!strcmp(bstr("prefonly"),"yes")) {
616 er_flags |= QR_PREFONLY;
619 er_flags &= ~QR_PREFONLY;
622 if (!strcmp(bstr("readonly"),"yes")) {
623 er_flags |= QR_READONLY;
626 er_flags &= ~QR_READONLY;
629 if (!strcmp(bstr("network"),"yes")) {
630 er_flags |= QR_NETWORK;
633 er_flags &= ~QR_NETWORK;
636 if (!strcmp(bstr("directory"),"yes")) {
637 er_flags |= QR_DIRECTORY;
640 er_flags &= ~QR_DIRECTORY;
643 if (!strcmp(bstr("ulallowed"),"yes")) {
644 er_flags |= QR_UPLOAD;
647 er_flags &= ~QR_UPLOAD;
650 if (!strcmp(bstr("dlallowed"),"yes")) {
651 er_flags |= QR_DOWNLOAD;
654 er_flags &= ~QR_DOWNLOAD;
657 if (!strcmp(bstr("visdir"),"yes")) {
658 er_flags |= QR_VISDIR;
661 er_flags &= ~QR_VISDIR;
664 strcpy(buf,bstr("anon"));
666 er_flags &= ~(QR_ANONONLY | QR_ANONOPT);
667 if (!strcmp(buf,"anononly")) er_flags |= QR_ANONONLY;
668 if (!strcmp(buf,"anon2")) er_flags |= QR_ANONOPT;
671 if (!strcmp(bstr("bump"),"yes")) bump = 1;
673 sprintf(buf,"SETR %s|%s|%s|%u|%d",
674 er_name,er_password,er_dirname,er_flags,bump);
678 display_error(&buf[4]);
681 gotoroom(er_name, 0);
683 if (strlen(er_roomaide)>0) {
684 sprintf(buf,"SETA %s",er_roomaide);
688 display_error(&buf[4]);
693 gotoroom(er_name, 1);
699 * display the form for entering a new room
701 void display_entroom(void) {
708 display_error(&buf[4]);
712 printf("HTTP/1.0 200 OK\n");
715 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=000077><TR><TD>");
716 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
717 wprintf("<B>Enter (create) a new room</B>\n");
718 wprintf("</FONT></TD></TR></TABLE>\n");
720 wprintf("<FORM METHOD=\"POST\" ACTION=\"/entroom\">\n");
722 wprintf("<UL><LI>Name of room: ");
723 wprintf("<INPUT TYPE=\"text\" NAME=\"er_name\" MAXLENGTH=\"19\">\n");
725 wprintf("<LI>Type of room:<UL>\n");
727 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"public\" ");
728 wprintf("CHECKED > Public room\n");
730 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"guessname\" ");
731 wprintf("> Private - guess name\n");
733 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"passworded\" ");
734 wprintf("> Private - require password:\n");
735 wprintf("<INPUT TYPE=\"text\" NAME=\"er_password\" MAXLENGTH=\"9\">\n");
737 wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"invonly\" ");
738 wprintf("> Private - invitation only\n");
740 wprintf("<CENTER>\n");
741 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
742 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
743 wprintf("</CENTER>\n");
744 wprintf("</FORM></HTML>\n");
757 char er_password[10];
760 if (strcmp(bstr("sc"),"OK")) {
761 display_error("Cancelled. No new room was created.");
765 strcpy(er_name,bstr("er_name"));
766 strcpy(er_type,bstr("type"));
767 strcpy(er_password,bstr("er_password"));
770 if (!strcmp(er_type,"guessname")) er_num_type = 1;
771 if (!strcmp(er_type,"passworded")) er_num_type = 2;
772 if (!strcmp(er_type,"invonly")) er_num_type = 3;
774 sprintf(buf,"CRE8 1|%s|%d|%s",er_name,er_num_type,er_password);
778 display_error(&buf[4]);
781 gotoroom(er_name, 1);
786 * display the screen to enter a private room
788 void display_private(char *rname, int req_pass)
791 printf("HTTP/1.0 200 OK\n");
794 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
795 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
796 wprintf("<B>Goto a private room</B>\n");
797 wprintf("</FONT></TD></TR></TABLE>\n");
799 wprintf("<CENTER>\n");
800 wprintf("If you know the name of a hidden (guess-name) or\n");
801 wprintf("passworded room, you can enter that room by typing\n");
802 wprintf("its name below. Once you gain access to a private\n");
803 wprintf("room, it will appear in your regular room listings\n");
804 wprintf("so you don't have to keep returning here.\n");
807 wprintf("<FORM METHOD=\"POST\" ACTION=\"/goto_private\">\n");
809 wprintf("<TABLE border><TR><TD>");
810 wprintf("Enter room name:</TD><TD>");
811 wprintf("<INPUT TYPE=\"text\" NAME=\"gr_name\" VALUE=\"%s\" MAXLENGTH=\"19\">\n",rname);
814 wprintf("</TD></TR><TR><TD>");
815 wprintf("Enter room password:</TD><TD>");
816 wprintf("<INPUT TYPE=\"password\" NAME=\"gr_pass\" MAXLENGTH=\"9\">\n");
819 wprintf("</TD></TR></TABLE>\n");
821 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
822 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
823 wprintf("</FORM></HTML>\n");
828 * goto a private room
830 void goto_private(void) {
834 if (strcasecmp(bstr("sc"),"OK")) {
839 strcpy(hold_rm,wc_roomname);
841 strcat(buf,bstr("gr_name"));
843 strcat(buf,bstr("gr_pass"));
848 gotoroom(bstr("gr_name"),1);
852 if (!strncmp(buf,"540",3)) {
853 display_private(bstr("gr_name"),1);
857 printf("HTTP/1.0 200 OK\n");
859 wprintf("%s\n",&buf[4]);
866 * display the screen to zap a room
868 void display_zap(void) {
869 printf("HTTP/1.0 200 OK\n");
872 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
873 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
874 wprintf("<B>Zap (forget) the current room</B>\n");
875 wprintf("</FONT></TD></TR></TABLE>\n");
877 wprintf("If you select this option, <em>%s</em> will ", wc_roomname);
878 wprintf("disappear from your room list. Is this what you wish ");
879 wprintf("to do?<BR>\n");
881 wprintf("<FORM METHOD=\"POST\" ACTION=\"/zap\">\n");
882 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
883 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
884 wprintf("</FORM></HTML>\n");
895 if (strcmp(bstr("sc"),"OK")) {
900 serv_printf("GOTO %s", wc_roomname);
903 display_error(&buf[4]);
910 display_error(&buf[4]);
914 gotoroom(bstr("_BASEROOM_"),1);
921 * Confirm deletion of the current room
923 void confirm_delete_room(void) {
929 display_error(&buf[4]);
933 printf("HTTP/1.0 200 OK\n");
935 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
936 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
937 wprintf("<B>Confirm deletion of room</B>\n");
938 wprintf("</FONT></TD></TR></TABLE>\n");
941 wprintf("<FORM METHOD=\"POST\" ACTION=\"/delete_room\">\n");
943 wprintf("Are you sure you want to delete <FONT SIZE=+1>");
944 escputs(wc_roomname);
945 wprintf("</FONT>?<BR>\n");
947 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Delete\">");
948 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
950 wprintf("</FORM></CENTER></BODY></HTML>\n");
956 * Delete the current room
958 void delete_room(void) {
962 strcpy(sc, bstr("sc"));
964 if (strcasecmp(sc, "Delete")) {
965 display_error("Cancelled. This room was not deleted.");
972 display_error(&buf[4]);
975 gotoroom("_BASEROOM_", 1);